map和multimap
1.map和multimap将key(键值)和value(值)作为元素,成对存储,它们可以根据key的排序准则自动将元素排序。Multimap允许重复键值,map不允许。
2.map<key,elem> 以less<>(实际上就是小于号)为排序准则
map<key,elem,op> 以op为排序准则
multimap<key,elem> 以less<>(实际上就是小于号)为排序准则
multimap<key,elem,op> 以op为排序准则
op可以是less<>或者是greater<>(大于),在排序准则中要指定key的类型。
map<float,string,greator<float> > mymap,红色的两个之间有空格
3. 数据插入
1)使用pair<>和insert语句。mymap.insert(pair<T1,T2>( t1,t2 ));
pair的功能是把pair后面<>里面指定的两个类型合并为一个pair类型。
2)使用make_pair和insert
直接使用mymap.insert(make_pair(t1,t2));
3) 使用value_type和insert
mymap.insert(map<T1,T2>::value_type(t1,t2));
4. m[key]中key可以为任意类型
使用insert添加map新元素时,如果插入元素的key值与容器中原有元素key值有重复,则插入失败。但使用下标方式插入则不会插入失败,会用新插入的元素的value去覆盖原有元素的value。
5. 迭代器
map<T1,T2>::iterator pos; pos->first pos->second。
不能通过pos->first这种方式改变元素的key。
不能直接改变元素的key,因为这会破坏正确顺序,要修改元素的key,必须先移除拥有该key的元素,然后插入拥有新的key值的元素。
若元素本身value的值非const,可以通过pos->second来改变value的值。
6. 容器元素的删除
1)通过erase()函数删除具有某个key值的单个元素。mymap.erase(key);
2)通过erase()函数删除具有某个位置上的元素。
pos=mymap.find(key);//find()函数用来搜索拥有某个key的第一个元素,并返回该元素的迭代器。没有找到就返回该容器的end().
If(pos!=mymap.end())
mymap.erase(pos);
3)删除map中具有某个value值的元素
If(pos->second==value)
{
temp=pos;
mymap.erase(temp);
break;
}
4) 通过erase()函数删除某个区间内所有的元素
mymap.erase(ibeg,iend);
5) clear()删除所有元素
7. key值为用户自定义类型
当key值为用户自定义类型(结构体,类),无法实现存储的自动排序。需要用到一种叫做“操作符重载”的技术。(操作符重定义)
实际上,小于号,大于号,等于号都是函数,他们的返回值类型都是bool。函数原型operator<(参数) operator>(参数) operator==(参数)
a>b实际调用了a.operator>(b);
struct stu{
int num;
float height;
bool operator<(const stu &x)const
{
return num>x.num;
}
};
map<stu,int>stumap;
stumap.insert(make_pair(stu2,23));
stumap.insert(make_pair(stu1,22));
8. map按key排序与按value排序
1)按key排序,默认less(从小到大),greater<key类型>(从大到小)
struct CmpByKeyLength {
bool operator()(const string& k1, const string& k2) {
return k1.length() < k2.length();//只按长度排序则长度相同的不能插入
}
};
struct CmpByKeyLength {
bool operator()(const string& k1, const string& k2) {
if(k1.length()==k2.length())
return k1<k2;
return k1.length() < k2.length();
}
};//允许有相同长度的插入
map<string, int, CmpByKeyLength> name_score_map;
2) 按value排序
typedef pair<string,int> PAIR;
template<class T1>
struct cmpByValue{
bool operator()(const T1 &x,const T1 &y)
{
return x.second<y.second;
}
};
map<string,int> myMap;
vector<PAIR> myVec(myMap.begin(),myMap.end());
sort(myVec.begin(),myVec.end(),cmpByValue<PAIR>());
for(int i=0;i<myVec.size();i++)
cout<<myVec[i].first<<" "<<myVec[i].second<<endl;