C++ Map简介

来源:互联网 发布:剑三淘宝买金 编辑:程序博客网 时间:2024/05/16 01:39

C++ Map简介:

C++主要的关联容器(associative-container),在map中的元素是一些关键字-值(key-value)对:关键字起到索引的作用,值则表示与索引相关联的数据。字典是一个很好的使用map的例子:可以将单词作为关键字,将单词解释作为值。map内部自建一棵红黑树,对数据具有自动排序的功能,所以在map内部所有的数据都是有序的。map支持快速查找,其复杂度基本是log(n),支持快速插入,快速删除,快速修改。


1.定义关联容器:

map常用构造函数:

//默认构造函数,空容器map<string, size_t> myMap; //key-value对包围在花括号中{key,value}     map<sring,string>myMap = {{“aaaa”,”bbbb”},{“bbbb”,”cccc”}};//拷贝构造函数map<int,int>myMap;map<int,int>myCopyMap(myMap);

2.map添加数据

map<int,int>myMap;myMap.insert(pair<int,int>(2,2));myMap.insert(map<int,int>::value_type(3,3));myMap[4]=4;
tip:使用insert方法插入时,如果map中已经存在key关键字,则该次插入失败,容器中将保存上一次插入成功时key-value对。而使用数组方式插入时,则会更新本次插入结果key-new_value。


例如insert方式:

map <int,int> myMap;pair<map<int, int>::iterator, bool> Insert_Pair;Insert_Pair=myMap.insert(pair<int,int>(1,2));cout<<(Insert_Pair.second==false)<<endl;Insert_Pair=myMap.insert(pair<int,int>(1,3));cout<<(Insert_Pair.second==false)<<endl;myMap.insert(pair<int,int>(3,4));myMap.insert(pair<int,int>(4,5));

例如数组方式:

map<int,int> myMap;myMap[1]=1;myMap[1]=2;myMap[1]=3;myMap[2]=4;myMap[3]=5;map <int,int>::iterator it=myMap.begin();while(it!=myMap.end()){cout<<"first:"<<it->first<<endl;cout<<"second:"<<it->second<<endl;it++;}

tip:由上代码可知insert返回一个pair,告诉我们插入操作是否成功,返回的pair的first的成员是一个迭代器指向插入key-value对元素,second成员是一个bool值,指出元素是否插入成功。


3.map根据关键字key查找:

使用find()函数根据key进行查找,如果查找成功则返回指向该关键字对应的迭代器,如果没有找到,则返回尾后迭代器myMap.end()。

tip:当从map中提取元素时,会得到一个pair类型的对象,它保存名为first和second的公有数据成员,其中first成员保存关键字key,second保存相应的值value。

例如:

map<int,int>::iterator it;it=map.find(2);if(it!=myMap.end()){cout<<”key=”<<it->first<<endl;cout<<”value=”<<it->second<<endl;}

4.map容器的迭代

如下代码所示:

map<string,int>myMap;myMap.insert(pair<string,int>(“hello”,1));myMap.insert(pair<string,int>(“world”,2));map<string,int>::iterator it=myMap.begin();for(;it!=myMap.end();it++){cout<<it->first<<endl;cout<<it->second<<endl;}

5.数据的清空与判断

清空map的数据可以用clear函数,判定map中是否有数据可以用empty()函数,它返回true则说明map为空。例如:

//myMap为非空关联容器
if(myMap.empty()){cout<<"1"<<endl;}myMap.clear();if(myMap.empty()){cout<<"2"<<endl;}

6.数据删除,使用erase()

//删除迭代器第一个元素map<string,int>::iterator it;it=myMap.begin();myMap.erase(it);//删除之后若要重新迭代容器,需要给迭代器变量重新赋值it=myMap.begin();//使用erase的一种重载可以清空map,作用相当于clear()myMap.erase(myMap.begin(),myMap.end());//使用erase的一种重载可以按照关键字删除//如果容器中不存在该关键字,函数返回0,删除失败,不改变原容器myMap.erase(“hello”);


参考:

《C++ primer》 (第五版)

http://www.kuqin.com/cpluspluslib/20071231/3265.html

0 0
原创粉丝点击