STL容器——map/multimap
1、map/multimap概念
map的所有元素都会根据元素的键值自动排序。map所有的元素都是pair,同时拥有键和值,pair的第一元素被视为键值,第二元素被视为值,map不允许两个元素有相同的键。不可以通过map 的迭代器改变map的键值,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。可以修改map的值map和list拥有相同的某些性质,当对它的容器元素进行新增或者删除操作时,操作之前的所有迭代器在操作结束依然有效。元素插入过程是按排序规则插入,不能指定插入位置。在插入操作和删除操作上比vector快。multimap和map的操作类似,唯一区别是multimap键值可重复map和multimap都是以红黑树为底层实现机制。
2、map构造函数
map<T1,T2> mapT;//map默认构造函数map(const map &mp);//拷贝构造函数map& operator=(const map &mp);//重载等号操作符map.swap(mp);//交换两个集合容器
map<int, string> mapA;
map<string, float> mapB;
mapA.insert
3、map大小操作
size();//返回容器中元素的数目empty();//判断容器是否为空
void test()
{
map<int,string> mapA;
mapA.insert(pair<int,string> (3,"小红"));
mapA.insert(pair<int,string> (4,"小花"));
mapA.insert(pair<int,string> (5,"小明"));
if (mapA.empty())
{
unsigned long long Size = mapA.size();
cout << Size << endl;
}
}
4、map插入元素操作
mapA.insert(pair<int,string> (3,“小花”));//第一种mapA.insert(make_pair(2,“小明”));//第二种mapA.insert(map<int,string>::value_type(1,“小李”));//第三种mapA[3]=“小刘”;//第四种
前三种采用insert()方法插入,返回值pair<iterator,bool>,若key已经存在,则报错,第四种若key已经存在,则修改。第四种方式性能比较差,插入3时,先在mapA中查找主键为3的项,若没有发现,则将一个键为3 ,值为初始值的对组插入到mapA中,然后再将值修改为“小刘”。若发现已经存在3这个键,则修改这个键对应的value。
void test()
{
map<int,string> mapA;
pair<map<int,string>::iterator, bool> result= mapA.insert(pair<int,string> (3,"小红"));
int resultFirst =(result.first)->first; //3
string resltSecond = (result.first)->second;//"小红"
bool resultS = result.second;//true
pair<map<int,string>::iterator, bool> res = mapA.insert(map<int,string>::value_type(5,"小明"));
if(!res.second)
{
cout << "插入失败" << endl;
}
mapA.insert(map<int,string>::value_type(4,"小花"));
mapA[6] = "小刘";
//迭代器遍历
for(map<int,string>::iterator it=mapA.begin();it!=mapA.end();it++)
{
pair<int,string> pr = *it;
int key = pr.first;
string value = pr.second;
}
}
map<T1,T2,less<T1>> mapA;//该容器是按值的升序排列元素的。默认方式map<T1,T2,greater<T1>> mapA;//降序
5、map删除操作
clear();//删除全部元素erase(pos);//删除pos迭代器处的元素,返回下一元素的迭代器erase(beg,end);//删除[beg,end)区间元素,返回下一元素的迭代器erase(key);//删除容器key为key的对组
void test()
{
map<int,string> mapA;
mapA.insert(pair<int,string>(1,"小红"));
mapA.insert(map<int,string>::value_type(2,"小明"));
mapA.insert(make_pair(3,"小菜"));
mapA[4] = "小花";
mapA.erase(mapA.begin());//删除第一个元素
mapA.erase(mapA.begin(),++(++mapA.begin()));
mapA.clear();
}
6、map查找操作
map.find(key);//查找ky是否存在,若存在,返回该键的元素的迭代器,若不存在,返回map.end()map.count(keyElem);//返回容器key为keyElem的对组个数,对map来说,不是0就是1,对multimap来说有可能大于1lower_bound(keyElem);//返回第一个key>keyElem元素的迭代器upper_bound(keyElem);//返回第一个key<keyElem元素的迭代器equal_range(keyElem);//返回key=keyElem的上下限的两个迭代器
void test()
{
map<int,string> mapA;
map<int,string>::iterator it = mapA.find(3);
if (it ==mapA.end())
{
cout << "没找到" << endl;
}
else
{
pair<int,string> pairA = *it;
int ID = pairA.first;//int ID = it->first;
string strName = pairA.second;//it->second;
}
}
例如: mapStu 是用 map<int,string>声明的容器,已包含{1,"小李"}{3,"小张"}{5," 小王"}{7,"小赵"}{9,"小陈"}元素。map<int,string>::iterator it;
it = mapStu.lower_bound(5); //it->first==3 it->second=="小张"
it = mapStu.upper_bound(5); //it->first==7 it->second=="小赵"
it = mapStu.lower_bound(6); //it->first==5 it->second=="小王"
it = mapStu.upper_bound(6); //it->first==7 it->second=="小赵"