C++标准库---map&multimap
来源:互联网 发布:开通淘宝商城的流程 编辑:程序博客网 时间:2024/06/05 20:55
使用map和multimap需要注意以下几点:
1.map和multimap将key/value(键值/实值 对组)当做元素,进行管理。它们可根据key的排序准则自动将元素元素排序。multimap允许重复元素,map不允许。
2.map的第一个参数被当做元素的key,第二个参数被当做元素的value,第三个参数用它来定义排序准则。元素的次序由它们的key决定,和value无关。
3.map和multimap根据元素的key自动对元素进行排序,这么一来,根据已知的key搜寻某个元素时,就能够有很好的性能,而根据已知value搜寻元素时,性能就很糟糕。
4.“自动排序”这一性质使得map和multimap身上有了一条重要的限制:不可以直接改变元素的key,因为这会破坏正确次序。要修改元素的key,必须先移除拥有该key的元素,
然后插入拥有新的key/value的元素。从迭代器的角度来看,元素的key是常数,至于元素的value倒是可以直接修改。
5.map和multimap不支持元素直接存取,因此元素的存取通常是经由迭代器进行。不过map有个例外,map提供下标操作符,可直接存取元素。
6.在map和multimap中,key被视为常数,因此不能调用任何变动性算法,例如你不能对它们调用remove(),因为remove()算法实际上是以一个参数值覆盖被移除的元素。如果要移除map和multimap的元素,你只能使用它们所提供的成员函数。
7.将map视为关联式数组:
关联式容器并不提供元素的直接存取,你必须依靠迭代器,map是个例外。Non-const map提供下标操作符,支持下标操作符。支持元素的直接存取,不过下标操作符的索引值并非元素整数位置,而是元素的key,也就是说索引可以是任意型别,而非局限为整数型别。
8.map和一般数组之间的区别不仅仅在于索引型别,其他的区别包括:
如果你使用某个key作为索引,而容器之中尚未存在对应元素,那么就会自动安插该元素,新元素的value由default构造函数构造。
优点是:你可以透过更方便的接口对着map安插新元素。
缺点是:你可能不小心误置新元素。
代码示例:
//map修改key&value#include<iostream>#include<map>#include<algorithm>#include<string>using namespace std;int main(){typedef map<string,float> StringFloatMap;StringFloatMap stocks;stocks["BASF"]=369.50;stocks["VW"]=413.50;stocks["Daimler"]=819.00;stocks["BMW"]=834.00;stocks["Siemens"]=842.20;StringFloatMap::iterator pos;for(pos=stocks.begin();pos!=stocks.end();++pos){cout<<"stock: "<<pos->first<<"\t"<<"price: "<<pos->second<<endl;}cout<<endl;for(pos=stocks.begin();pos!=stocks.end();++pos){pos->second*=2;//修改value}for(pos=stocks.begin();pos!=stocks.end();++pos){cout<<"stock: "<<pos->first<<"\t"<<"price: "<<pos->second<<endl;}cout<<endl;stocks["Volkswagen"]=stocks["VW"];//修改keystocks.erase("VW");//删除原来的for(pos=stocks.begin();pos!=stocks.end();++pos){cout<<"stock: "<<pos->first<<"\t"<<"price: "<<pos->second<<endl;}cout<<endl;system("pause");return 0;}
运行结果:
//查找#include<iostream>#include<map>#include<algorithm>#include<string>#include<iomanip>using namespace std;void print(){cout.setf(ios::left,ios::adjustfield);cout<<" "<<setw(10)<<"english "<<"german "<<endl;cout<<setfill('-')<<setw(20)<<""<<setfill(' ')<<endl;}int main(){typedef multimap<string,string> StrStrMap;StrStrMap dict;dict.insert(make_pair("day","Tag"));dict.insert(make_pair("strange","fremd"));dict.insert(make_pair("smart","elegant"));dict.insert(make_pair("trait","Merkmal"));dict.insert(make_pair("car","Auto"));dict.insert(make_pair("strange","seltsam"));dict.insert(make_pair("smart","raffiniert"));dict.insert(make_pair("smart","klug"));dict.insert(make_pair("clever","raffiniert"));StrStrMap::iterator pos;print();for(pos=dict.begin();pos!=dict.end();++pos){cout<<" "<<setw(10)<<pos->first<<pos->second<<endl;}cout<<endl;string word("smart");cout<<word<<": "<<endl;for(pos=dict.lower_bound(word);pos!=dict.upper_bound(word);++pos)//查找key{cout<<" "<<pos->second<<endl;}word="raffiniert";cout<<word<<": "<<endl;for(pos=dict.begin();pos!=dict.end();++pos){if(pos->second==word)//查找value{cout<<" "<<pos->first<<endl;}}cout<<endl;word="day";pos=dict.find(word);//keyif(pos!=dict.end()){dict.erase(pos);//删除key}print();for(pos=dict.begin();pos!=dict.end();++pos){cout<<" "<<setw(10)<<pos->first<<pos->second<<endl;}cout<<endl;word="raffiniert";for(pos=dict.begin();pos!=dict.end();){if(pos->second==word){dict.erase(pos++);}else{++pos;}}print();for(pos=dict.begin();pos!=dict.end();++pos){cout<<" "<<setw(10)<<pos->first<<pos->second<<endl;}cout<<endl;system("pause");return 0;}
运行结果(查找部分):
运行结果(删除部分):
- C++标准库---map&multimap
- c++map和multimap
- c++标准库——map和multimap容器
- c++stl中的map/multimap
- stl库之map、multimap
- STL 标准模板库 vector queue list map multimap的使用基础
- C++:标准模板库map
- (c++)vector map multimap set 的使用
- C++:关联容器(set,multiset,map,multimap)
- C++STL学习(5)容器map和multimap
- STL::map,multimap用法
- std::map和multimap
- Map和MultiMap使用
- map,multimap,set,multiset
- map和multimap
- STL容器:map,multimap
- STL---map 和 multimap
- map与multimap
- cocos2dx 3d开源项目 fantasyWarrior3D 从零走起 2 [ChooseRoleScene]
- Map键值排序
- T-CODE笔记
- 使用repo下载google 的android4.4 源码,和编译.运行
- 禁止其它用户本地登陆计算机
- C++标准库---map&multimap
- 哈希表中查找成功和不成功时的平均查找长度如何计算
- Hadoop计算中的Shuffle过程
- Struts和Spring所须包
- [BZOJ 1026][SCOI 2009]windy数(数位DP)
- ORMLite外键引用
- 采用Filter过滤器设置字符集
- 初探swift语言的学习
- Git系列博客——(1)初识git