在c ++中使用object作为键访问值

时间:2018-03-10 12:06:00

标签: c++ stl maps key

先生,我正在实施双色图。 Here is my sample code但当我将std::map<key,val>密钥作为用户定义的对象时,我无法实现

graph[bic].setColor("color");
map<node,node>::iterator itt=graph.begin();
node &kkk=itt->second;
cout<<"not work "<<kkk<<endl;

因为未找到密钥bic(节点类型),并且在map stl []操作符中创建引用并使用默认值返回它。 Reference但另一方面

map<node,node>::iterator fnd=find(graph.begin(),graph.end(),bic);
if(fnd==graph.end())
    cout<<"not find"<<endl;
else{
    node& ch=fnd->second;
    ch.setColor("yellow");
}
map<node,node>::iterator it=graph.begin();
node &pp=it->second;
cout<<"work "<<pp<<endl;

当我插入地图的第一个值时。下一个是检查密钥是否存在的冗长过程。我想要重载map stl的下标operator []来访问键的值。但这给了我一个不受欢迎的事情。 如何实现这位先生?例如

    node& cpyNode=graph[Node]; // Node is object of node
            or
    graph[Node].setcolor();    // Node is object of node

1 个答案:

答案 0 :(得分:0)

问题在于operator<

std::map中,如果两个密钥的比较小于另一个密钥,则认为它们是等效的(不唯一)。

您当前的实现看起来像这样

bool operator < (const node& ver) const{
    return (this->vertex==ver.vertex);
}

如果一个键具有相同的顶点值,它会认为一个键少于另一个键,如果你尝试graph[sing],你会得到更奇怪的结果。

sing.vertex != bic.vectex起,bic < singsing < bic的比较将返回false,std::map会认为它们相等。

只需将operator<更改为

即可
bool operator < (const node& ver) const{
    return vertex < ver.vertex;
}

你会得到你期望的结果。