C/C++ Map 关于insert、iterator、erase、char * key总结
来源:互联网 发布:软件测试基础方法 编辑:程序博客网 时间:2024/04/29 21:20
本文主要讲解了STL map常用方法insert,及与之相关的pair、make_pair,同时简明阐述了iterator+erase结合使用时可能出现的问题。
目录:
- 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_pairpair<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中存放的是以下这样的:
其实,map中是这样的:
有两个方法可以进行补救,
- 将char* 改为string;
- 自己动手写cmp函数,再按照以下方式定义map。
map<char*, int, cmp> mapName;
- C/C++ Map 关于insert、iterator、erase、char * key总结
- [C++]char* 做map 的KEY
- [C++]关于map的Key值
- C++map key不存在
- STL: reverse_iterator / iterator 关系以及 erase 相关(C++)
- 关于map::erase
- 关于std::map erase
- 迭代器 stl map erase iterator 正确用法
- map key char*
- 【C/C++】关于char *, char[], const char *等等
- 关于map::erase的使用说明
- 关于c++map
- c++map使用总结
- 关于STL erase的iterator失效问题
- 关于STL erase的iterator失效问题
- c:forecach中获取MAP的KEY
- 关于char *c = "xxx"
- C++STL:erase
- 【Linux基础学习之五】Linux管理命令的基础学习(df、du、free、kill、tar等)
- html学习笔记(标签)
- Could not get lock /var/lib/dpkg/lock解决措施
- 自适应阵
- bzoj2671: Calc
- C/C++ Map 关于insert、iterator、erase、char * key总结
- UISprite和UITexture
- 亡羊补牢,为时未晚
- pair 对组
- 疯狂Java笔记:第 1 章 Java简介与开发环境的搭建
- 轻量却超强——推荐几款好用的截图工具
- 1540 银河英雄传说
- vector使用swap释放内存
- 459. Repeated Substring Pattern