此问题与using char as a key in stdmap直接相关。
我理解传入的比较函数的作用以及char *
类型作为键所需的原因。但是,我不确定更新实际上是如何工作的。
我很好奇你要更新密钥的情况。 std::map
如何比较const char *
,cmp_str
之间的相等性只是告诉地图插入树中插入键的顺序。
我已经对stl_tree.h
代码(pulled from here)进行了一些挖掘,但却找不到多少。我唯一的猜测是它做了直接的记忆比较。
我对底层stl_tree
类如何处理这种情况感兴趣,或者它是否一直没有正确处理它,哪些边缘情况会中断?
代码
#include <map>
#include <iostream>
#include <cstring>
struct cmp_str
{
bool operator()(char const *a, char const *b)
{
return std::strcmp(a, b) < 0;
}
};
int main ( int argc, char ** argv )
{
std::map<const char*, int, cmp_str> map;
map["aa"] = 1;
map["ca"] = 2;
map["ea"] = 3;
map["ba"] = 4;
map["ba"] = 5;
map["bb"] = 6;
map["ba"] = 7;
std::map<const char*, int, cmp_str>::iterator it = map.begin();
for (; it != map.end(); it++ )
{
std::cout << (*it).first << ": " << (*it).second << std::endl;
}
return 0;
}
输出
aa: 1
ba: 7
bb: 6
ca: 2
ea: 3
答案 0 :(得分:6)
好吧,cmp_str
可用于查找相同的密钥。如果cmp_str::operator(x,y)
和cmp_str::operator(y,x)
都返回false
,则表示您找到了重复的密钥。真的没有更多的东西。
答案 1 :(得分:6)
有序容器都使用等价类:如果两个值都小于另一个,则认为两个值a
和b
是等价的:!(a < b) && !(b < a)
或者,如果您坚持使用符号二元谓词!pred(a, b) && !pred(b, a)
。
注意,您需要将指针保留在地图中:如果指针超出范围,您将得到奇怪的结果。当然,字符串文字在整个程序的整个生命周期内都是有效的。