7

这个问题与使用 char 作为 stdmap 中的键直接相关。

我了解传入的比较函数的作用以及为什么它需要char *类型作为键。但是,我不确定更新实际上是如何工作的。

我很好奇您正在更新密钥的情况。如何std::map知道如何比较 之间的相等性const char *cmp_str只告诉 map 将键插入树的顺序。

我已经对代码进行了一些挖掘stl_tree.h从这里提取),但找不到太多。我唯一的猜测是它进行了直接的内存比较。

我对下级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
4

2 回答 2

6

嗯,cmp_str可以用来查找相同的键。如果两者都cmp_str::operator(x,y)cmp_str::operator(y,x)return false,你发现了一个重复的键。真的没有更多的东西了。

于 2012-10-15T18:27:07.563 回答
6

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

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

于 2012-10-15T18:27:42.290 回答