map和multimap

mapmultimap

1.mapmultimapkey(键值)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_pairinsert

直接使用mymap.insert(make_pair(t1,t2));

3) 使用value_typeinsert

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. mapkey排序与按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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值