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

c – 使用char *作为std :: map中的键,它是如何工作的,第1张

概述这个问题直接与 using char as a key in stdmap有关. 我理解传入的比较函数的作用以及为什么它需要char *类型作为键.但是,我不确定更新实际上是如何工作的. 我很好奇你要更新密钥的情况. std :: map如何知道如何比较const char *之间的相等性,cmp_str只告诉map将键插入到树中的顺序. 我已经对stl_tree.h代码(pulled from 这个问题直接与 using char as a key in stdmap有关.

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

我很好奇你要更新密钥的情况. std :: map如何知道如何比较const char *之间的相等性,cmp_str只告诉map将键插入到树中的顺序.

我已经对stl_tree.h代码(pulled from here)进行了一些挖掘,但是找不到多少.我唯一的猜测是它做了直接记忆比较.

我对underling 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*,cmp_str>::iterator it = map.begin();    for (; it != map.end(); it++ )    {        std::cout << (*it).first << ": " << (*it).second << std::endl;    }    return 0;}

产量

aa: 1ba: 7bb: 6ca: 2ea: 3
解决方法 有序容器都使用等价类:如果一个小于另一个,则两个值a和b被认为是等价的:!(a< b)&& !(b< a)或者,如果你坚持用二元谓词表示符号!pred(a,b)&& !pred(b,a). 请注意,您需要将指针保留在地图中:如果指针超出范围,您将得到奇怪的结果.当然,字符串文字在程序的整个生命周期内都保持有效. 总结

以上是内存溢出为你收集整理的c – 使用char *作为std :: map中的键,它是如何工作的全部内容,希望文章能够帮你解决c – 使用char *作为std :: map中的键,它是如何工作的所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存