从unordered_map获取键和值的列表
从unordered_map
获取键和值的列表(作为vector
)的最有效方法是什么?
为了具体,假设有问题的地图是一个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();
我可以遍历地图并收集结果,但有没有更有效的方法? 有一个方法也可以用于普通地图,因为我可能会切换到这个地方。
好吧,在这里你去:
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
或集装箱。
使用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
testing它按预期打印键和值。
在STL中没有内置的方法来获取地图上的所有键或值。
迭代无序映射或常规映射没有什么不同,最好的方法是迭代它并将键或值收集到一个向量中。
你可以写一个模板函数来迭代任何一种地图。
join很晚,但认为这可能对某人有帮助。
两个使用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);