map key char*
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*相关推荐
- Sass函数:Sass Maps的函数-map-has-key($map,$key)
map-has-key($map,$key) 函数将返回一个布尔值.当 $map 中有这个 $key,则函数返回 true,否则返回 false. 前面的示例,当 $key 不在 $map 中时,使用 ...
- 【Groovy】map 集合 ( 根据 Key 获取 map 集合中对应的值 | map.Key 方式 | map.‘Key’ 方式 | map[‘Key’] 方式 | 代码示例 )
文章目录 一.根据 Key 获取 map 集合中对应的值 1.通过 map.Key 方式获取 map 集合中的值 Value 2.通过 map.'Key' 方式获取 map 集合中的值 Value 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得到相应类型的零值 ...
- golang 哪些类型可以作为map key
在golang 中,我们已经熟知的可以作为map key 的类型有 string, int. 那还有哪些类型可以作为key,哪些类型不可以呢? 本文对此做下简单介绍. 在golang规范中,可比较的类 ...
- STL MAP(key,value)
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
- java map key是否存在_java中如何判断map集合中是否存在key
有两种方法可以判断map集合中是否存在某个key. 方法1:直接使用java api提供的containsKey(): 方法2:循环遍历,逐个比较. java相关视频推荐:java视频 具体实现代码如 ...
- java map key 大写转小写_Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)...
Java 是区分大小写的,普通的Map例如HashMap如果其中的key="ABC" value="XXX" 那么map.get("Abc" ...
- Map key 和 value 的输出;
put(Object key,Object value) 方法向集合中增加内容: get(E key) 方法根据 key 找出对应的 value. keyset() 方法,输出 key 值: valu ...
- Google Map Key申请流程
一.环境准备 需要能访问google网站的网络环境,申请一个google play的账号 二.Google Map 申请key 1. 访问使用 API 密钥 | Maps SDK for Andr ...
最新文章
- 最新成果被AAAI-20收录,腾讯安全科恩实验室加快AI产业化应用
- SQL SERVER 2008权限配置
- 他是清华姚班高材生,选择从谷歌辞职回山西教书,张昆玮说「不想像成功学那样生活」...
- html判断表单是否为空,layui判断表单是否为空
- 【android】【转】class android.media.MediaPlayer
- WORD如何使得公式居中,公式自动编号且编号右对齐,如何交叉引用公式?
- Hibernate的transaction嵌套
- 微信内测“群直播”;小米发布第三代屏下相机技术;马斯克宣布脑机接口重大突破 | 极客头条...
- 协方差矩阵(covariance matrix)
- [长文科普]浅谈数据湖的应用与安全
- java练习题-求int类型N值的阶乘
- mysql 两阶段加锁_MySql-两阶段加锁协议
- CMD看累了?推荐一个不错的终端模拟器
- 高校wifi认证登录
- Ubuntu 18.04桌面版卸载不必要的自带软件
- Pycharm添加默认头注释方法
- HTTP Header中的内容(请求Header、响应Header)
- tomcat优化(五)tomcat调优
- 卡片式设计流行的秘密 — 看完这15个案例你就懂了!
- Java Swing JButton:按钮组件
热门文章
- python相关知识介绍一种理财方法_我是如何使用python来确定理财策略的
- else应输入一个语句是什么意思_Python基础知识储备,关于if-else使用性能的一点感悟...
- RuntimeError: Can‘t call numpy() on Variable that requires grad. Use var.detach().numpy()
- 【Pytorch神经网络理论篇】 35 GaitSet模型:步态识别思路+水平金字塔池化+三元损失
- 下载Pytorch的自带数据集时报错=urllib.error.URLError: urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
- vb 根据pid获取句柄_C++中避免返回指向对象内部的句柄(handles)
- LeetCode 2132. 用邮票贴满网格图(DP/二维差分)
- LeetCode LCP 29. 乐团站位(数学 等差数列)
- LeetCode 1207. 独一无二的出现次数
- andriod studio 运行 无结果_无负压静音供水设备下篇一