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