使用char *作为std :: map中的键,它是如何工作的

时间:2012-10-15 18:23:39

标签: c++ map stdmap const-char

此问题与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

2 个答案:

答案 0 :(得分:6)

好吧,cmp_str可用于查找相同的密钥。如果cmp_str::operator(x,y)cmp_str::operator(y,x)都返回false,则表示您找到了重复的密钥。真的没有更多的东西。

答案 1 :(得分:6)

有序容器都使用等价类:如果两个值都小于另一个,则认为两个值ab是等价的:!(a < b) && !(b < a)或者,如果您坚持使用符号二元谓词!pred(a, b) && !pred(b, a)

注意,您需要将指针保留在地图中:如果指针超出范围,您将得到奇怪的结果。当然,字符串文字在整个程序的整个生命周期内都是有效的。