C/C++ Map 关于insert、iterator、erase、char * key总结
2017-02-22 21:39
531 查看
本文主要讲解了STL map常用方法insert,及与之相关的pair、make_pair,同时简明阐述了iterator+erase结合使用时可能出现的问题。
目录:
insert
iterator erase
char - key
make_pair(1,”Beixi Fish”);
其中,map中key值是唯一的,如果重复插入就会造成insert fail. 所以判断insert是否成功,就显得尤为重要!
insert主要有三种写法:
map中存储结构为pair,
一般建议使用pair,网上说该性能最佳。
pair函数声明如下:
根据map使用方式,或者一般迭代器的使用方法,可以有知道可以这样使用:
而STL-map中,当insert失败时,pair第二个参数为
这里说明一下,如果你的
这里牵涉到一个迭代器重置的问题,试分析以下code:
当你run该程序时,直接弹出糟糕的
这里不做过多解释,而直接给出STL推荐的使用方式:
当然,如果你要移除指定项,可以这样写:
这将为你带来不少麻烦。
你以为map中存放的是以下这样的:
其实,map中是这样的:
有两个方法可以进行补救,
将char* 改为string;
自己动手写cmp函数,再按照以下方式定义map。
目录:
insert
iterator erase
char - key
insert
STL中map是以<key,value>字典形式存储数据,一般可以使用
make_pair构造键值对,比如:
make_pair(1,”Beixi Fish”);
其中,map中key值是唯一的,如果重复插入就会造成insert fail. 所以判断insert是否成功,就显得尤为重要!
insert主要有三种写法:
theMap.insert(pair<int,const char *>(1,"Beixi Fish")); theMap.insert(make_pair(2,"Beixi Fish")); theMap[3] = "Beixi Fish";
map中存储结构为pair,
make_pair与
pair最明显的区别是:使用pair时需要强制指明类型。
一般建议使用pair,网上说该性能最佳。
pair函数声明如下:
pair<map<int,const char*>::iterator, bool> a = theMap.insert(pair<int,const char *>(1,"Beixi Bear")); //make_pair pair<map<int,const char*>::iterator, bool> b = theMap.insert(make_pair(1,"Beixi Bear"));
根据map使用方式,或者一般迭代器的使用方法,可以有知道可以这样使用:
//pair<map<int,const char*>::iterator, bool> b; map<int,const char*>::iterator iter = b.first; bool ret = b.second;
而STL-map中,当insert失败时,pair第二个参数为
false,从而有以下一段完整的insert示例:
#include <iostream> #include <map> using namespace std; int main(void){ //key - value map<int,const char*> theMap; bool ret = theMap.insert(make_pair(1,"Beixi Fish")).second; if (!ret){//delete printf("insert fail. - Beixi Fish"); } ret = theMap.insert(make_pair(1,"Beixi Bear")).second; if (!ret){//delete printf("insert fail. Beixi Bear"); } return 0; }
这里说明一下,如果你的
make_pair的第二个参数const char*是在堆(new)上开辟的,那么你应该在if(!ret){}中delete它,以避免内存泄漏。
iterator & erase
STL map中有一个叫erase的方法:从map中删除指定的节点。这里牵涉到一个迭代器重置的问题,试分析以下code:
#include <iostream> #include <map> using namespace std; int main(void){ //key - value map<int,const char*> theMap; theMap.insert(make_pair(1,"Beixi Fish")); theMap.insert(make_pair(2,"Bei Jing")); theMap.insert(make_pair(3,"China")); map<int,const char*>::iterator iter; for (iter = theMap.begin(); iter != theMap.end(); ++iter){ theMap.erase(iter); } return 0; }
当你run该程序时,直接弹出糟糕的
Debug Assertion Failed!
这里不做过多解释,而直接给出STL推荐的使用方式:
e.g.
for (iter = theMap.begin(); iter != theMap.end(); ){ theMap.erase(iter++); }
当然,如果你要移除指定项,可以这样写:
for (iter = theMap.begin(); iter != theMap.end(); ){ if (iter->second == "Beixi Fish") theMap.erase(iter++); else ++iter; }
char* -> key
这里需要再强调一个问题,尽量不要使用map<char*, int>,也就是说将
char *作为key。
这将为你带来不少麻烦。
你以为map中存放的是以下这样的:
key | value |
---|---|
CSDN | 1 |
Github | 5 |
CNBLOGS | 2 |
key | value |
---|---|
0xABC78 | 1 |
0xBCD56 | 5 |
0x89YTA | 2 |
将char* 改为string;
自己动手写cmp函数,再按照以下方式定义map。
map<char*, int, cmp> mapName;
相关文章推荐
- C++关于迭代器删除(erase)插入(insert)失效问题http://m.blog.csdn.net/blog/a327369238/26715187
- map常用成员(关联容器)----创建map<主键,主键对应的值>,增insert,删erase,改查找find,然后修改second,遍历iterator,获取元素个数size,判空empty
- C++关于迭代器删除(erase)插入(insert)失效问题
- 关于c++中map的应用
- c++ 关于map的遍历 删除
- 关于map::operator[]与map::insert (浏览次数:1002)
- Map的keySet方法 关于iterator()的方法
- C++模板类的问题 map::iterator 编译报错的问题
- C++语法基础--关联容器--map(一)--constructor,operator[],insert
- 关于错误 Unhandled exception in (KERNEL32.DLL):0xE06D7363:Microsoft C++ Exce vc and access insert 记录
- c++ 关于map的使用
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- 关于C++声明iterator时出现找不到namespace的问题
- More Exceptional C++关于map
- 关于vecteor::erase(iterator++),导致崩溃的问题
- 关于c++中map的内存占用问题
- 关于C++类库KYLib: 使用AVLtree实现 map 类模板源码
- 关于struts2的checkboxlist、select等标签发生could not be resolved as a collection/array/map/enumeration/iterator type异常的记录
- map和set(关于iterator失效的问题)
- 关于map的erase方法的使用