我正试图从std::unordered_multimap<uint, T> lookup
转到std::vector<T> v
到目前为止,我试过
std::vector<T> v(lookup.begin(), lookup.end());
但它显然不起作用,因为begin()
和end()
的结果迭代器的类型为pair<uint, T>
,那么最快的正确方法是什么?
感谢您的帮助!
答案 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()
,以避免过多的内存分配。
答案 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;
}