在C ++中将map(value,index)转换为vector(index,value)的最快方法是什么?

时间:2016-08-26 05:58:02

标签: c++ dictionary vector

我有一张地图,我想将其转换为矢量。但我也想翻转键和值;并根据新密钥订购它们。然而,它必须快速,因为它有大约300.000元素。

为了更好的言论:

地图:

a->5
b->3
c->4
d->2
e->6
f->1

矢量shold就像这样 - > [f,d,b,c,a,e]

一个循环可以吗?

2 个答案:

答案 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

上运行它