map和multimap的简介
map是标准关联式容器,一个map是一个键值对序列,即(key, value)对。提供基于key的快速检索能力
map中的key是唯一的,而multimap中的key不是唯一的
集合中的元素按一定顺序排列(基于红黑树,是平衡二叉树,在插入和删除操作上比vector快)
元素插入过程是按排序规则插入,不能指定插入位置
map可以直接存取key对应的value,支持[ ]操作符,如map[key] = value(将key键对应的值修改为value)
multimap与map区别
map支持唯一键值,每个键只能出现一次,而multimap中的相同键可以出现多次,multimap不支持[ ]操作符
map和multimap采用模板类实现,如map<T1, T2> mapT;
map的插入方式
map.insert();
1.通过pair的方式插入对象
mapStu.insert(pair<int, string>(3, "小张"));
返回值pair<iterator,bool>
2.通过value_type的方式插入对象
mapStu.insert(map<int,string>::value_type(1,"小李"));
返回值pair<iterator,bool>
3.通过数组的方式插入值
mapStu[3] = "小刘";
mapStu[4] = "小王";
map<T1, T2, less<T1>> mapA; //该容器是按键的升序进行排列元素,是默认排列
map<T1, T2, greater<T1>> mapB; //该容器是按键的降序进行排列元素
map对象的拷贝构造与赋值
map(const map &mp); //拷贝构造函数
map& operator=(const map &mp); //重载等号操作符
map.swap(mp); //交换两个集合容器
map的大小
map.size(); //返回容器中元素的数目
map.empty(); //判断容器是否为空
map的删除
map.clear(); //删除所有元素
map.erase(pos); //删除迭代器指向的元素,并且返回下一个元素的迭代器
map.earse(beg, end); //删除区间beg到end的所有元素,为左闭右开区间
map.earse(keyElem); //删除key为keyElem的对组
map的查找
map.find(key); //查找键key是否存在,如果存在则返回该键值元素的迭代器,若不存在,则返回map.end();
map.count(keyElem); //返回容器中key为keyElem的对组个数,对map来说,要么是0,要么是1,而multimap可能大于1
map.lower_bound(keyElem); //返回第一个key>=keyElem元素的迭代器
map.upper_bound(keyElem); //返回第一个key>keyElem元素的迭代器
map.equal_range(keyElem); //返回容器中key与keyElem相等的上下限的两个迭代器,上限是闭区间,下限是开区间,如[beg,end)
eg:
//有元素{1,“小李”}{3,“小张”}{5,“小王”}{7,“小赵”}{9,“小陈”}
pair<map<int , string>:: iterator, map<int , string>:: iterator> paitE= map.equal_range(5);
map<int, string>::iterator it1 = paitE.first;
map<int, string>::iterator it2 = paitE.second;
it1->second == "小王";
it2->second == "小赵";
通过迭代器遍历
for(map<int, string>::iterator it = mapA.begin(); it < mapA.end(); it++)
{
pair<int, string> pr = *it;
int ikey = pr.first;
string str = pr.second;
}