C++的STL中map与multimap
一、map与multimap的区别等同于set 与multiset的区别。
map是关联容器,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同。
注意,不能直接修改 map 容器中的关键字。因为 map 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。
要使用map,必须包含<map>关键字。
二、map功能
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key -Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
key:
map的第一个关键字,也就是key,每个key只能在map中出现一次。
value:
map的第二个参数,也称为对应key的值。
map内部数据排列其实是内部自建一颗红黑树(非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,红黑树的特点是增加和删除节点对迭代器的影响很微弱,操作的话只对操作节点有影响。
对于迭代器来说,可以修改实值,而不能修改key。
template < class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class map{
...
typedef pair< const Key, T > value_type;
...
};
map 和 multimap 十分类似,区别在于 map 容器中元素的关键字不能重复。multimap 有的成员函数,map 都有。此外,map 还有成员函数 operator[]:
T & operator[] (Key k);
该成员函数返回 first 值为 k 的元素的 second 部分的引用。如果容器中没有元素的 first 值等于 k,则自动添加一个 first 值为 k 的元素。如果该元素的 second 成员变量是一个对象,则用无参构造函数对其初始化。
#include <iostream>
#include <map> //map的头文件
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
template<typename T1,typename T2>
ostream &operator<<(ostream &o,const pair<T1,T2> &p){ //pair对象输出为(first,second)形式
o<<"("<<p.first<<","<<p.second<<")";
return o;
}
template<class T>
void Print(T first,T last){
//输出pair的fitst,last区间
for(;first!=last;++first)
cout<<*first<<" ";
cout<<endl;
}
typedef map<int,double,greater<int> > MYMAP; //此容器关键字为整形,元素按关键字从大到小排序
int main(int argc, char** argv) {
MYMAP mp;
mp.insert(MYMAP::value_type(15,2.7));
pair<MYMAP::iterator,bool> p=mp.insert(make_pair(15,99.3));
if(!p.second)
cout<<*(p.first)<<"already exists"<<endl; //会输出
cout<<"1)"<<mp.count(15)<<endl;
mp.insert(make_pair(20,9.3));
cout<<"2)"<<mp[40]<<endl; //如果没有关键字为40的元素,则插入一个
cout<<"3)";
Print(mp.begin(),mp.end());
mp[15]=6.28; //把关键字为15的元素值改成6.28
mp[17]=3.14; //插入关键字为17的元素,并将其值设为3.14
cout<<"4)";
Print(mp.begin(),mp.end());
return 0;
}
要访问关键字为 40 的元素。在没有这个元素的情况下,一个关键字为 40、值为 0 的元素被自动插入容器。mp[40] 等价于mp.operator[](40);
,其返回值是关键字为 40 的那个元素(不论是原有的还是新插入的)的 second 成员变量的引用。后面两行的道理与此类似。
三、Map常用函数
C++ maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是 1或0。
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
四、迭代器
map<long long,int>::iterator t;
for(t=p.begin();t!=p.end();t++)
{......
.....}
//前向迭代器、反向迭代器、数组形式输出
for(it = int_str.begin(); it != int_str.end(); it++) //正向输出
cout<<it->first<<' '<<it->second<<endl;
map<int, string>::reverse_iterator iter;
for(iter = int_str.rbegin(); iter != int_str.rend(); iter++) //反向输出
cout<<iter->first<<" "<<iter->second<<endl;
for(int i = 1; i <= int_str_n; i++) //数组形式输出
cout<<int_str[i]<<endl;