Fah*_*tha 53 c++ unordered-map vector std c++11
vector从a获取键和值的列表(作为a )的最有效方法是unordered_map什么?
具体来说,假设有问题的地图是一个unordered_map<string, double>.然后我想把键作为a vector<string>,并将值作为a vector<double>.
unordered_map<string, double> um;
vector<string> vs = um.enum_keys();
vector<double> vd = um.enum_values();
Run Code Online (Sandbox Code Playgroud)
我可以遍历地图并收集结果,但是有更有效的方法吗?有一个方法也适用于常规地图会很好,因为我可能会切换到那个.
Kei*_*yne 62
好的,你走了:
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);
}
Run Code Online (Sandbox Code Playgroud)
效率可能会提高,但确实如此.你在两个容器上操作,所以没有任何STL魔法可以隐藏这个事实.
正如路易斯所说,这适用于任何STL map或set容器.
Mar*_*enn 12
使用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;
}
Run Code Online (Sandbox Code Playgroud)
我用以下命令编译了这个:
g++ keyval.cpp -std=c++14 -o keyval
Run Code Online (Sandbox Code Playgroud)
测试它按预期打印键和值.