我有一张地图,我想将其转换为矢量。但我也想翻转键和值;并根据新密钥订购它们。然而,它必须快速,因为它有大约300.000元素。
为了更好的言论:
地图:
a->5
b->3
c->4
d->2
e->6
f->1
矢量shold就像这样 - > [f,d,b,c,a,e]
一个循环可以吗?
答案 0 :(得分:2)
实际上它真的很简单。假设地图值是字符串,您可以这样做:
std::vector<std::string> myVector(myMap.size());
for (auto const& mapEntry : myMap) {
myVector[mapEntry->second - 1] = mapEntry->first;
}
但是没有检查索引值。你必须确保(在排序时)这些是从1开始的连续整数。这当然不是由地图本身保证的。可能存在重复或差距。
编辑:注意到在评论中你写的是值是带有三个浮点坐标的点。然后只需用您的点类型替换我的代码中的std::string
。我只是想补充一点,因为可能的舍入错误,使用浮点值作为映射键通常不是一个好主意。但这与你的问题无关。
答案 1 :(得分:0)
这是一个解决方案(需要C ++ 11)。
#include <iostream> #include <string> #include <vector> #include <map> #include <algorithm> #include <iterator> using std::string; using std::map; using std::vector; int main() { map<char, int> m = {{'a',5},{'b',3},{'c',4},{'d',2},{'e',6},{'f',1}}; vector<std::pair<char,int> > v{ std::make_move_iterator(m.begin()), std::make_move_iterator(m.end())}; std::sort(v.begin(), v.end(), [](std::pair<char,int>& l, std::pair<char,int>& r) { return l.second < r.second;}); vector<char> keys; std::transform(v.begin(), v.end(), std::back_inserter(keys), [](std::pair<char,int> & a){ return a.first;}); for(auto a : keys) { std::cout << a << std::endl; } }
您也可以在here
上运行它