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;
    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;
    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>

时间: 2024-10-11 09:26:46

map容器的排序问题的相关文章

hdu 4941 Magical Forest (map容器)

Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 135    Accepted Submission(s): 69 Problem Description There is a forest can be seen as N * M grid. In this forest, there is so

HDU 1113 Word Amalgamation (map 容器 + string容器)

http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across the United States there is a word game called Jumble. The object of this game is to solve a riddle, but in order to find the letters that appear in th

简单即用的临时Map容器(参考TimeCacheMap和RotatingMap)

因为业务需要,经常会缓存一些临时数据.比如:手机号发送验证码, 60s内同一个手机号不能重复发送验证码.查询航班信息,缓存1分钟热门查询数据.... 之前一直使用redis作为数据缓存,简单方便..但是如果是个小App,数据没有那么大,可能需要缓存的数据只有不到100KB,使用redis就大材小用 最近一个项目上线的时候,老大跟我说:真的有必要用redis么..不行就先删掉吧..自己想了下,因为App入口有两个ip,不同机器,虽然业务量不大,为了session共享,还是上了 如果只有一个入口(不

【转】C++中map容器的说明和使用技巧

C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明    1   头文件   #include   <map>     2   定义   map<string,   int>   my_Map;   或者是typedef     map<string,   int>   MY_MAP;   MY_MAP   my_Map;     3   插入数据   (1)   my_Map["

HNU 12888 Encryption(map容器)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12890&courseid=274 解题报告:输入一个有n个单词的句子,然后再输入这n个单词对应的意思是什么,要你翻译出这个句子最后是什么. 一个裸的map 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm>

c++ STL map容器成员函数

map容器用于查找,设置键值和元素值,输入键值,就能得到元素值.map对象中的元素时刻都是有序的,除非无序插入的.它是用平衡树创建的.查找很快. 函数 描述,注意有r的地方都是不能用it代替的. map (comp,alloc) map (it first, it last, comp,alloc) map (map& x) Comp为比较函数,用于排序,alloc不用鸟它.两个参数有默认值,可不填,按默认的.创建空map. 用一段元素填充,并设置排序函数. 拷贝x中的元素并创建新map.估计新

关于map 容器insert顺序

今天测试我的节点,maya一次次死掉,一点一点的打印测试,良久才知:我想当然的将插入map的顺序,作为我执行的顺序直接遍历,打印数据显示,map有自动将键值排序的功能,比如以字符串为例,会按照a.b.c....顺序排好. 而且对于map,如果一个元素key不存在,但是直接map[key],那么map的size就增加1,我感觉有点儿相当于insert,但map[key]没有值.这样很不规范,对于有一定代码量的程序测试造成不必要的困扰,所以最好使用find函数,判断是否==map.end() 关于s

[2016-01-19][C++][关于map容器]

map容器 会根据key值进行排序 map容器带有一个count函数,所以不用 每次都用 find来判断是否存在某个元素 当对map容易进行下标索引时,如果元素不存在,会自动创建,并赋值给默认值 如可以这样玩: map<string,int> mp; mp['A']++; 来自为知笔记(Wiz)

cocos2dx使用map容器实例(C++)

关于map容器 cocos2dx中使用map容器,头文件无须添加, 只要声明命名空间using namespace std;即可 关于map学习资料 学习资料1: http://blog.csdn.net/realxie/article/details/7252662  这是一个很不错的基础实例!赞! 我们在cocos2dx的例如helloworld的int中添加以下两段代码: map<int* , int> pMap ; int A[100]={5,2,5,8,9}; for(int i=0