概述
map是STL的一个关联容器,它提供一对一的hash
1.所有元素都会根据元素的键值自动排序
2.所有的元素都是pair,同时拥有键值和实值。
第一个参数:键值。第二个参数:实值
3.map容器的键值唯一不可变,实值可变
multimap允许key相同
初始化map对象的方式:
map<T1,T2> v1;//默认的初始化方式,内容为空
map<T1,T2> v2(v1);//v2是v1的一个副本
map<T1,T2> v5(v1.begin(),v1.end());//v5包含v1的一个区域元素[v1.begin,v1.end());
map常用函数
v1.empty():判断集合是否为空,为空返回真,否则为假
v1.insert(pair<T1,T2>(值1,值2)):将v1[值1]=值2插入map中,注意T1和T2要和v1中的一样
v1.insert(map<T1,T2>::value_type(值1,值2)):将v1[值1]=值2插入map中,注意T1和T2要和v1中的一样
v1[值1]=值2:将v1[值1]的值设置为值2
insert的方法,若map中已存在关键字值1,则插入失败。
=的方法,若map中已存在关键字值1,则用值2覆盖原值
判断是否插入成功的方法
int main() { map<int,float> v1; v1[123]=1.23; v1[456]=4.56; pair<map<int,float>::iterator,bool> yorn; yorn=v1.insert(pair<int,float>(123,1.26)); if(!yorn.second) cout<<"Error"; return 0; } //输出Error
v1.begin():返回向量(数组)的首元素地址
v1.end(): 返回向量(数组)的末元素的下一个元素的地址
v1.rbegin():返回逆向队列的第一个数据,即c容器的最后一个数据。
v1.rend():返回逆向队列的最后一个数据的下一个位置,即c容器的第一个数据再往前的一个位置。
map<int,float>::iterator it;
for(it=v1.begin();it!=v1.end();it++)
cout<<it->first<<" "<<it->second<<endl;
map<int,float>::reverse_iterator its;
for(its=v1.rbegin();its!=v1.rend();its++)
cout<<its->first<<" "<<its->second<<endl;
map中的迭代器是指针,要用->来访问first和second
v1.clear():清空向量
v1.size():返回得到向量中元素的个数
v1=v2:
swap(v1.v2):交换两个数组
v1.count():用来查找map中某个关键值出现的次数。但是由于map中不允许重复,故用来判断某一键值是否在map出现过了
v1.erase(iterator):删除定位器iterator指向的值
v1.erase(first,second):删除定位器first和second之间的值
v1.erase(key_value):删除键值key_value的值
v1.find():查找一个数,返回给定值的定位器,找不到就返回迭代器end()
v1.lower_bound():返回第一个大于等于key_value的定位器
v1.upper_bound():返回第一个大于key_value的定位器
v1.equal_range():返回一对定位器,分别表示第一个大于或等于给定关键值的元素和第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值
#include <iostream> #include <set> using namespace std; int main(){ set<int> s; set<int>::iterator iter; for(int i = 1 ; i <= 5; ++i) { s.insert(i); } for(iter = s.begin() ; iter != s.end() ; ++iter) { cout<<*iter<<" "; } cout<<endl; pair<set<int>::const_iterator,set<int>::const_iterator> pr; pr = s.equal_range(3); cout<<"第一个大于等于 3 的数是 :"<<*pr.first<<endl; cout<<"第一个大于 3的数是 : "<<*pr.second<<endl; return 0; }
map的所有函数
1.map 构造函数
map<T1, T2> T;//map 默认构造函数:
map(const map &mp);//拷贝构造函数
2.map 赋值操作
map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器
3.map 大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
4.map 插入数据元素操作
map.insert(...); //往容器插入元素, 返回 pair<iterator,bool>
map<int, string> mapStu;
// 第一种 通过 pair 的方式插入对象
mapStu.insert(pair<int, string>(3, "小张"));
// 第二种 通过 pair 的方式插入对象(推荐)
mapStu.inset(make_pair(-1, "校长"));
// 第三种 通过 value_type 的方式插入对象
mapStu.insert(map<int, string>::value_type(1, "小李"));
// 第四种 通过数组的方式插入值
mapStu[3] = "小刘";
mapStu[5] = "小王";
注意:m[10]是寻找key为10的实值,但是如果容器中没有key为10的值,却使用了m[10],会创建一个key为10实值为空的对组
5.map 删除操作
clear();//删除所有元素
erase(pos);//删除 pos 迭代器所指的元素, 返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 , 返回下一个元素的迭代器。
erase(keyElem);//删除容器中 key 为 keyElem 的对组。
6.map 查找操作
find(key);//查找键 key 是否存在,若存在, 返回该键的元素的迭代器;若不存在,返回map.end();
count(keyElem);//返回容器中 key 为 keyElem 的对组个数。 对 map 来说, 要么是 0,要么是 1。 对 multimap 来说, 值可能大于 1。
lower_bound(keyElem);//返回第一个 key>=keyElem 元素的迭代器。
upper_bound(keyElem);//返回第一个 key>keyElem 元素的迭代器。
equal_range(keyElem);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器