STL中map的key能否用char 呢?当然可以!
在程序中需要用到一个map,本来是这样写的,
map<string, int> mapStr;
为了追求效率,把string改成了char

map<char , int> mapStr;
结果呢?
可想而知,每次放进去的是指针,
当查找的时候就出问题了,总是找不到。
因为key中存放的是指针,当然找不到了。
需要重载一下操作符,当查找时比较指针对应的字符串就可以了。
修改如下:
struct ptrCmp
{
bool operator()( const char
s1, const char * s2 ) const
{
return strcmp( s1, s2 ) < 0;
}
};
map<char , int, ptrCmp> mapStr;
再进行查找就OK了!
===========================
C++ map中key使用指针的问题 (2012-12-07 08:19:28) 转载▼
标签: map find失败 find不到结果 分类: 调试
C++实际开发的过程会经常使用到map。map是一个key-value值对,key唯一,可以用find进行快速的查找。其时间复杂度为O(logN),如果采用for循环进行遍历数据时间复杂度为O(N)。如果map中的数据量比较少时,采用find和for循环遍历的效率基本没有太大的区别,但是在实际的开发过程中,存储在map中的数据往往是大量的,这个时候map采用find方式效率比遍历效率高的多。
确定采用find方式查找数据后,我们需要考虑存储map的空间复杂度,对于基础数据类型的数据(int char等)这里就不做讨论。本文讨论的是map中存储的数据结构struct情况。
1、如果map中的key为struct此时,需要先对struct进行操作符重载,关于这部分内容可以参考C++ 重载操作符示例
2、map中的key只能是对象,而不能是指针。(这一点尤为重要)。下面给出三个map定义进行说明:
std::map<NHSymbolkey, Stru_NHSymbol>
pmapNHSymbolInfo1
std::map<NHSymbolkey, Stru_NHSymbol> pmapNHSymbolInfo2
std::map<NHSymbolkey, Stru_NHSymbol>* pmapNHSymbolInfo2
其中,pmapNHSymbolInfo1、pmapNHSymbolInfo2中使用find正常,遍历也正常,pmapNHSymbolInfo3使用find查找不到对应的数据(数据已经存在,find不到,遍历可以找到)
原因:std::map<NHSymbolkey, Stru_NHSymbol>* pmapNHSymbolInfo2在find的时候是根据指针进行查找的。而在数据insert时,数据都是new的,每次new出的地址是不一样的,在find数据时,根据地址查找结果就找不到数据。通过遍历是取出地址中内容一一比较,这样能够找到数据。
pmapNHSymbolInfo1、pmapNHSymbolInfo2两种方式都可以使用find方式查找数据,但是pmapNHSymbolInfo1中Stru_NHSymbol为对象,这样会使map占用空间比较大,pmapNHSymbolInfo2的Stru_NHSymbol为指针,存储时地址占用空间小,但是每次都是new处理来的,所有一定要记住使用完成后一定要delete,否则会出现内存泄露。

3、 map插入数据2中方式比较
std::map<NHSymbolkey, Stru_NHSymbol> pmapNHSymbolInfo
pmapNHSymbolInfo->insert(std::make_pair(pNHSymbolkey, pNHSymbol));该方式的key如果出现重复,则会插入数据失败;
(*pmapNHSymbolInfo)[objNHSymbolkey] = pNHSymbol;该方式的key如果出现重复则直接覆盖掉原来的数据,永远不会出现插入失败的问题。

结论:C++ map中key不要使用指针,请直接使用对象。

转载于:https://www.cnblogs.com/Corphish/articles/7409786.html

map key char*相关推荐

  1. Sass函数:Sass Maps的函数-map-has-key($map,$key)

    map-has-key($map,$key) 函数将返回一个布尔值.当 $map 中有这个 $key,则函数返回 true,否则返回 false. 前面的示例,当 $key 不在 $map 中时,使用 ...

  2. 【Groovy】map 集合 ( 根据 Key 获取 map 集合中对应的值 | map.Key 方式 | map.‘Key’ 方式 | map[‘Key’] 方式 | 代码示例 )

    文章目录 一.根据 Key 获取 map 集合中对应的值 1.通过 map.Key 方式获取 map 集合中的值 Value 2.通过 map.'Key' 方式获取 map 集合中的值 Value 3 ...

  3. Go语言 判断key是否在map里 if _, ok := map[key]; ok

    if val, ok := map[key]; ok {//do something here } 如果key在map里 val 被赋值map[key] ok 是true 否则val得到相应类型的零值 ...

  4. golang 哪些类型可以作为map key

    在golang 中,我们已经熟知的可以作为map key 的类型有 string, int. 那还有哪些类型可以作为key,哪些类型不可以呢? 本文对此做下简单介绍. 在golang规范中,可比较的类 ...

  5. STL MAP(key,value)

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...

  6. java map key是否存在_java中如何判断map集合中是否存在key

    有两种方法可以判断map集合中是否存在某个key. 方法1:直接使用java api提供的containsKey(): 方法2:循环遍历,逐个比较. java相关视频推荐:java视频 具体实现代码如 ...

  7. java map key 大写转小写_Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)...

    Java 是区分大小写的,普通的Map例如HashMap如果其中的key="ABC" value="XXX" 那么map.get("Abc" ...

  8. Map key 和 value 的输出;

    put(Object key,Object value) 方法向集合中增加内容: get(E key) 方法根据 key 找出对应的 value. keyset() 方法,输出 key 值: valu ...

  9. Google Map Key申请流程

    一.环境准备 需要能访问google网站的网络环境,申请一个google play的账号 二.Google Map 申请key 1. 访问使用 API 密钥  |  Maps SDK for Andr ...

最新文章

  1. 最新成果被AAAI-20收录,腾讯安全科恩实验室加快AI产业化应用
  2. SQL SERVER 2008权限配置
  3. 他是清华姚班高材生,选择从谷歌辞职回山西教书,张昆玮说「不想像成功学那样生活」...
  4. html判断表单是否为空,layui判断表单是否为空
  5. 【android】【转】class android.media.MediaPlayer
  6. WORD如何使得公式居中,公式自动编号且编号右对齐,如何交叉引用公式?
  7. Hibernate的transaction嵌套
  8. 微信内测“群直播”;小米发布第三代屏下相机技术;马斯克宣布脑机接口重大突破 | 极客头条...
  9. 协方差矩阵(covariance matrix)
  10. [长文科普]浅谈数据湖的应用与安全
  11. java练习题-求int类型N值的阶乘
  12. mysql 两阶段加锁_MySql-两阶段加锁协议
  13. CMD看累了?推荐一个不错的终端模拟器
  14. 高校wifi认证登录
  15. Ubuntu 18.04桌面版卸载不必要的自带软件
  16. Pycharm添加默认头注释方法
  17. HTTP Header中的内容(请求Header、响应Header)
  18. tomcat优化(五)tomcat调优
  19. 卡片式设计流行的秘密 — 看完这15个案例你就懂了!
  20. Java Swing JButton:按钮组件

热门文章

  1. python相关知识介绍一种理财方法_我是如何使用python来确定理财策略的
  2. else应输入一个语句是什么意思_Python基础知识储备,关于if-else使用性能的一点感悟...
  3. RuntimeError: Can‘t call numpy() on Variable that requires grad. Use var.detach().numpy()
  4. 【Pytorch神经网络理论篇】 35 GaitSet模型:步态识别思路+水平金字塔池化+三元损失
  5. 下载Pytorch的自带数据集时报错=urllib.error.URLError: urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
  6. vb 根据pid获取句柄_C++中避免返回指向对象内部的句柄(handles)
  7. LeetCode 2132. 用邮票贴满网格图(DP/二维差分)
  8. LeetCode LCP 29. 乐团站位(数学 等差数列)
  9. LeetCode 1207. 独一无二的出现次数
  10. andriod studio 运行 无结果_无负压静音供水设备下篇一