我有一个map<int int>
. 我需要获取第一个 int (键)的向量,但按第二个 int 的顺序(值)排序。最快的方法是什么?
问问题
1003 次
3 回答
5
任何告诉您他们拥有“最快”方式的人都是骗子,因为他们不知道您使用的是什么硬件/C++ 实现等。
这是一种方法:
typedef pair<int,int> item;
vector<item> mytmp(mymap.begin(), mymap.end());
sort(mytmp.begin(), mytmp.end(), [](item lhs, item rhs) { return lhs.second < rhs.second; });
vector<int> myvec;
myvec.reserve(mytmp.size());
transform(
mytmp.begin(), mytmp.end(),
back_inserter(myvec);
[](item i) { return i.first; }
);
于 2012-07-02T11:45:55.043 回答
3
您可以创建第二张地图,在其中将<key,value>
配对交换为<value,key>
. 但是,如果您有重复的值,您将遇到麻烦。
您可能真正想要的是双向地图。例如,参见http://www.boost.org/doc/libs/1_47_0/libs/bimap/doc/html/index.html。
于 2012-07-02T11:31:20.430 回答
1
您可以将其放入 a 中std::vector<std::pair<int, int> >
,然后编写一个谓词以对第二个值进行排序。然后通过对中的第一个值访问密钥:
std::map<int, int> the_map;
typedef std::pair<int,int> pair_type;
the_map[1] = 2;
the_map[2] = 1;
the_map[3] = 8;
the_map[4] = 8;
the_map[5] = 3;
struct Pred {
bool operator()(pair_type const& a, pair_type const& b) const {
return (a.second < b.second);
}
};
struct Tran {
int operator()(pair_type const& a) const {
return a.first;
}
};
std::vector<pair_type> vec(the_map.begin(), the_map.end());
std::sort(vec.begin(), vec.end(), Pred());
std::vector<int> result;
transform(vec.begin(), vec.end(), std::back_inserter(result), Tran());
BOOST_FOREACH(int const& r, result) {
cout << r << endl;
}
于 2012-07-02T11:46:52.517 回答