如何将std :: unordered_multimap <uint,t =“”>转储到std :: vector <t>?</t> </uint,>

时间:2014-08-06 12:21:56

标签: c++ c++11 vector stl iterator

我正试图从std::unordered_multimap<uint, T> lookup转到std::vector<T> v

到目前为止,我试过

std::vector<T> v(lookup.begin(), lookup.end());

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

感谢您的帮助!

5 个答案:

答案 0 :(得分: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";
}

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

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

Live Example

答案 1 :(得分: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; });

答案 2 :(得分:1)

使用循环到push_back向量中的项目。当然,它要求类型T可以复制构造:

for ( auto it = map.begin(); it != map.end(); it++)
    v.push_back(it->second);

对于更精确的解决方案,您可以在此之前使用reserve在向量中准备足够的空间来优化一点。此外,如果您要在此之后丢弃地图,您可以尝试避免复制项目,而是将其移入:

v.reserve(map.size());
for ( auto it = map.begin(); it!= map.end(); it++)
    v.emplace_back(std::move(it->second));

答案 3 :(得分:0)

我最近一直在尝试使用C ++ 11。这是我想出来的东西。

#include <iostream>
#include <iterator>
#include <vector>
#include <unordered_map>
#include <algorithm>

int main() {
    std::vector<int> v;
    typedef std::unordered_multimap<int, int> MapType;

    MapType m { { 1, 1 }, { 1, 2 }, { 2, 1 }, { 2, 2 }, { 3, 1 } };
    std::for_each(begin(m), end(m), [&](MapType::value_type i){v.push_back(i.second); });
    std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));

    return 0;
}

<强> Run my code online.

不可否认,这种使用STL算法的方法对于这个问题来说有点过分。

答案 4 :(得分:0)

我的方法是:[谨慎未经检验]

template <typename Map>
std::vector<typename Map::mapped_type> extract_values(Map const& m) {
    std::vector<typename Map::mapped_type> v;
    v.reserve(m.size());
    std::for_each(std::begin(m), std::end(m), [&](typename Map::const_reference p)
        { v.push_back(p.second); }
    );
    return v;
}

更简单:

template <typename Map>
std::vector<typename Map::mapped_type> extract_values(Map const& m) {
    std::vector<typename Map::mapped_type> v;
    v.reserve(m.size());
    for(auto& p : m)
        v.push_back(p.second);
    return v;
}