我如何通过其.second参数对地图进行排序

时间:2010-03-16 10:07:50

标签: c++ stl

如果我有一个从字符串到int的stl映射,并且我想打印排序的所有int值 - 我该怎么做?

6 个答案:

答案 0 :(得分:27)

由于地图的实施,您无法按地图对地图进行排序。

如果你想以这样的排序顺序发射地图中的元素,那么你必须先将地图内容转储到一个向量中(比如说)并对该向量进行排序:

template <typename T1, typename T2>
struct less_second {
    typedef pair<T1, T2> type;
    bool operator ()(type const& a, type const& b) const {
        return a.second < b.second;
    }
};

map<string, int> mymap;
// …

vector<pair<string, int> > mapcopy(mymap.begin(), mymap.end());
sort(mapcopy.begin(), mapcopy.end(), less_second<string, int>());

或者,只需复制地图中的值,保留键,然后直接对结果矢量进行排序。

答案 1 :(得分:6)

您可以将所有值复制到矢量中并对其进行排序。

#include <algorithm>
#include <map>
#include <vector>

int get_second( pair<string, int> i ){ return i.second; }

int main(int argc, char* argv){
  map<string, int> m;
  m["tt"] = 2;
  m["rr"] = 1;
  m["ee"] = 3;

  vector<int> v( m.size() );
  transform( m.begin(), m.end(), v.begin(), get_second );
  sort( v.begin(), v.end() );
  for (int i=0; i<v.size(); i++) cout << v[i] << endl;
}

答案 2 :(得分:4)

您无法自动执行此操作。 std::map使用第一个值(nomen omen'key')对内容进行排序。

相反,您可以使用boost::multi_index_container

答案 3 :(得分:3)

如果您需要多次这样做,保留两个单独的容器可能更有效,例如:您的地图和排序的容器(如setmultiset)用于存储已排序的整数,而不必创建容器并对其进行即时排序。但是你必须保持同步,这可能会变得肮脏。您可以通过将它们包装在一个类中来封装它,或者更好地使用boost::multi_index_container

答案 4 :(得分:1)

您无法对地图进行排序,它是关联容器,而不是顺序容器,关联容器按内部顺序排序。

如果您只想打印int值,可以将它们放入std::vector,对矢量进行排序,然后打印值。

答案 5 :(得分:0)

我宁愿将它们复制到vector,而不是使用set<int>

#include <map>
#include <set>
#include <string>
#include <iostream>
#include <iterator>

using namespace std;

set<int> map2set(map<string, int> const& m) {
 set<int> r;
 for (map<string, int>::const_iterator b = m.begin(), e = m.end(); b != e; ++b)
   r.insert(b->second);
 return r;
}

int main() {
 map<string, int> m;
 m.insert(make_pair("hello", 42));
 m.insert(make_pair("world", 24));
 set<int> s = map2set(m);
 copy(s.begin(), s.end(), ostream_iterator<int>(cout, "\n"));
}
相关问题