map容器的一些用法

看了好多人写的对map的排序 看得不太懂吧  自己写一些

map set multiset 三个容器都是 放进去 都是事先都要排序的 所以 erase insert find操作都是二分 复杂度都是logn

而 list vector 都是 n

注意的是set不能放进两个相同的元素   而vector是唯一个有下标的容器  map是独有的放进二元关系的容器


map如果放进去的是两个简单的元素对应关系如<int,int>,<char,int>等系统会默认是升序

如果你想从大到小遍历用反向迭代器就OK  rbegin(最后一个元素) -> rend(第一个元素的前一位 空) ++就是从后往前了 --则往后 如果需要一个结构体对应一个东西则需要写比较关系

怎么多值决定一值  排序问题


#include<stdio.h>
#include<string>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
    string s;
    char ch;
    int x;
    /*bool operator<(const node &a)const
     {

        return ch>=a.ch;
     }*/
    friend bool operator <(node a,node b)//这里排序优先关系得写严谨
    {
        if(a.ch!=b.ch)
            return a.ch>b.ch; //就优先队列中写法相反
        if(a.ch==b.ch)        //因为优先队列每次出的都是top(应该是最后的)
            return a.x>b.x;
        if(a.x==b.x)
            return a.s>=b.s;
    }

} gg;
int main()
{
    map<node,int>q;
    map<node,int>::iterator it;
    map<node,int>::reverse_iterator op;//反向迭代器
    gg.s="asd";
    gg.ch='a';
    gg.x=12;
    q[gg]=100;

    gg.s="asf";
    gg.ch='c';
    gg.x=13;
    q[gg]=10000;

    gg.s="asa";
    gg.ch='b';
    gg.x=12;
    q[gg]=1000;

    gg.s="asa";
    gg.ch='b';
    gg.x=14;
    q[gg]=10001;

    for(it=q.begin(); it!=q.end(); it++)
    cout<<((*it).first).s<<" "<<((*it).first).x<<" "<<it->second<<endl;
    printf("\n");
   for(op=q.rbegin(); op!=q.rend(); op++)
        cout<<((*op).first).s<<" "<<(*op).first.x<<" "<<op->second<<endl;
    return 0;
}



按map的value排序

只能说你用vector复制了一份然后SORT再用就好了其实 map本身的元素没有改变

那肿么办博主木鸡 

<span style="font-size:10px;">#include<iostream>
#include<string>
#include<string.h>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;

int cmp(const pair<string,double> &x,const pair<string,double> &y)
{
    return x.second > y.second;
}

void sortMapbyValue(map<string,double> &t_map,vector< pair<string,double> > &t_vec)
{
    for(map<string,double>::iterator iter = t_map.begin(); iter != t_map.end(); iter ++)
    {
        t_vec.push_back(make_pair(iter->first,iter->second));
    }

    sort(t_vec.begin(),t_vec.end(),cmp);
}

int main(void)
{
    map<string,double> m_result;
    vector< pair<string,double> > v_result;

    m_result.insert(pair<string,double>("abc",20.33));
    m_result.insert(pair<string,double>("abd",22.33));
    m_result.insert(pair<string,double>("abe",21.33));
    m_result.insert(pair<string,double>("abf",19.33));

    cout<<"sort by key :"<<endl<<endl;
    for(map<string,double>::iterator iter = m_result.begin(); iter != m_result.end(); iter++)
    {
        cout<<iter->first<<"\t\t"<<iter->second<<endl;
    }

    sortMapbyValue(m_result,v_result);

    cout<<"sort by value :"<<endl<<endl;
    for(int i=0; i<v_result.size(); i++)
    {
        cout<<v_result[i].first<<"\t\t"<<v_result[i].second<<endl;
    }
}</span>


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值