如何将std :: unordered_multimap <uint,T>转储到std :: vector <T>?

Lui*_*nes 4 c++ iterator stl vector c++11

我想从一个std::unordered_multimap<uint, T> lookup到一个std::vector<T> v

到目前为止我试过了

std::vector<T> v(lookup.begin(), lookup.end());
Run Code Online (Sandbox Code Playgroud)

但它显然不起作用,因为生成的迭代器begin()end()类型pair<uint, T>,所以最快的正确方法是什么?

谢谢您的帮助!

Tem*_*Rex 6

提取std::pair哈希映射中的值部分并将其放入向量中:

#include <iostream>
#include <unordered_map>
#include <vector>

int main() {
    using Map = std::unordered_multimap<int, int>;
    auto m = Map { {1, 1}, {1, 2}, {1, 3}, {2, 4}, {2, 5}, {3, 6} };

    std::vector<int> v;
    v.reserve(m.size());

    for (auto const& elem : m)
        v.push_back(elem.second);

    for (auto const& elem : v)
        std::cout << elem << "\n";
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用C++ 11,您可以使用ranged for-loop + auto以避免必须显式表达地图元素的类型.此外,您还可以使用initializer-list语法快速初始化地图.

注意:在实际示例中,请使用reserve()向量上的内容,以避免过多的内存分配.

实例.


utn*_*tim 5

试试这个:

std::vector<T> v;
v.reserve(lookup.size()); // optimization (allocate enough memory for all elements)

std::transform(std::begin(lookup), std::end(lookup), std::back_inserter(v),
    [](const std::pair<uint, T>& p) { return p.second; });
Run Code Online (Sandbox Code Playgroud)