看了好多人写的对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>