从vector
获取键和值的列表(unordered_map
)的最有效方法是什么?
具体而言,假设有问题的地图是unordered_map<string, double>
。
然后我想将密钥作为vector<string>
获取,将值作为vector<double>
获取。
unordered_map<string, double> um;
vector<string> vs = um.enum_keys();
vector<double> vd = um.enum_values();
我可以遍历地图并收集结果,但还有更多 有效的方法?有一个也适用于常规地图的方法会很好 因为我可能会改用它。
答案 0 :(得分:57)
好的,你走了:
std::vector<Key> keys;
keys.reserve(map.size());
std::vector<Val> vals;
vals.reserve(map.size());
for(auto kv : map) {
keys.push_back(kv.first);
vals.push_back(kv.second);
}
效率可能会提高,但确实如此。你在两个容器上操作,所以没有任何STL魔法可以隐藏这个事实。
正如路易斯所说,这适用于任何STL map
或set
容器。
答案 1 :(得分:10)
使用C ++ - 14您还可以执行以下操作(编辑为包含完整源代码):
#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
typedef string Key;
typedef int Value;
auto key_selector = [](auto pair){return pair.first;};
auto value_selector = [](auto pair){return pair.second;};
int main(int argc, char** argv) {
// Create a test map
unordered_map<Key, Value> map;
map["Eight"] = 8;
map["Ten"] = 10;
map["Eleven"] = 11;
// Vectors to hold keys and values
vector<Key> keys(map.size());
vector<Value> values(map.size());
// This is the crucial bit: Transform map to list of keys (or values)
transform(map.begin(), map.end(), keys.begin(), key_selector);
transform(map.begin(), map.end(), values.begin(), value_selector);
// Make sure this worked: Print out vectors
for (Key key : keys) cout << "Key: " << key << endl;
for (Value value : values) cout << "Value: " << value << endl;
return 0;
}
我用以下命令编译了这个:
g++ keyval.cpp -std=c++14 -o keyval
测试它按预期打印键和值。
答案 2 :(得分:2)
在STL中,没有内置方法可以从地图中获取所有键或值。
迭代无序地图或常规地图没有什么不同,最好的方法是迭代它并收集矢量的关键或值。
您可以编写模板函数来迭代任何类型的地图。
答案 3 :(得分:0)
加入很晚,但认为这对某人有帮助
两个模板函数使用key_type
和mapped_type
。
namespace mapExt
{
template<typename myMap>
std::vector<typename myMap::key_type> Keys(const myMap& m)
{
std::vector<typename myMap::key_type> r;
r.reserve(m.size());
for (const auto&kvp : m)
{
r.push_back(kvp.first);
}
return r;
}
template<typename myMap>
std::vector<typename myMap::mapped_type> Values(const myMap& m)
{
std::vector<typename myMap::mapped_type> r;
r.reserve(m.size());
for (const auto&kvp : m)
{
r.push_back(kvp.second);
}
return r;
}
}
用法:
std::map<long, char> mO;
std::unordered_map<long, char> mU;
// set up the maps
std::vector<long> kO = mapExt::Keys(mO);
std::vector<long> kU = mapExt::Keys(mU);
std::vector<char> vO = mapExt::Values(mO);
std::vector<char> vU = mapExt::Values(mU);