C++ 将用户定义的类存储在以成员为键的映射中

C++ 将用户定义的类存储在以成员为键的映射中,c++,map,struct,C++,Map,Struct,这就是我试图完成的,我想创建一个用户定义的项目结构,然后使用项目名称作为键将其存储在映射中。我可能是一个noob,但是有人能告诉我我做错了什么吗?当我尝试编译程序时,它会吐出一堆奇怪的输出,所以它看起来好像不工作,我该怎么办 map<project, string> provec; project current; cout << "Enter your project name: "; current.proname = getFileContents(cin);

这就是我试图完成的,我想创建一个用户定义的项目结构,然后使用项目名称作为键将其存储在映射中。我可能是一个noob,但是有人能告诉我我做错了什么吗?当我尝试编译程序时,它会吐出一堆奇怪的输出,所以它看起来好像不工作,我该怎么办

map<project, string> provec;

project current;

cout << "Enter your project name: ";
current.proname = getFileContents(cin);

cout << "Enter a description: ";
current.prodesc = getFileContents(cin);

cout << "How long until deadline: ";
current.protime = getFileContents(cin);

provec.insert(pair<project, string> ( current, current.proname ));
cout << endl << "You created a new project: " << current.proname
<< endl << "Project description: " << current.prodesc ;
map-provec;
项目电流;

cout您可能需要切换此选项:

map<project, string> provec;
map-provec;
为此:

map<string, project> provec;
map-provec;
对吧?


在这种情况下,您需要将项目的名称映射到项目本身。

您可以使用std::set,并提供一个特殊的比较器来使用proname作为键:

typedef std::set<project, []( const project &p1, const project &p2 ) { return p1.proname < p2.proname; } > provec;
typedef std::set provec;
或者,您可以为类
项目
重写运算符>。此解决方案的缺点是,您必须创建临时的
项目来执行查找

另一个解决方案是使用
boost::multi_index

使用std::map解决方案的问题:

  • 重复数据
  • 没有什么可以阻止您在地图中为key和field proname放置不同的sting,或者稍后替换该对象,因此更容易出错

你的意思是不是反过来-字符串(项目名称)作为键,
项目
实例作为值?如果你真的想将项目映射到这样的名称,只需在项目类中添加一个名为
name
的成员,但你已经有了它。好吧,我让它工作了,我的错误是我翻转了键和映射值