![](/img/trans.png)
[英]Iterator over std::unordered_map<int, std::vector<Element>>
[英]Find a value of an element in vector in a std::map < int , std::vector <int >>
有没有更漂亮的方法可以在without using loops
从地图中的向量内部获取值? 例如,如何获取元素值为50
的向量的键?
std::map < int , std::vector < int >> myMap;
std::vector < int > a= {10,20,30};
std::vector < int > b= {50,60,70};
myMap.insert({1000,a});
myMap.insert({2000,b});
如果值在一个以上的向量中,我可以得到键吗? 例如,如果50
在两个向量中?
std::vector < int > a= {10,20,50};
std::vector < int > b= {50,60,70};
这里适用于每个映射、值和内部容器:
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <iterator>
#include <optional>
template <typename ValueT, typename MapT>
std::optional<typename MapT::key_type> find_key_for_value_contained_in_intern_container(const ValueT& value, const MapT& map) {
auto key_it = std::find_if(std::begin(map), std::end(map), [&value] (const auto & element) {
return std::find(std::begin(element.second), std::end(element.second), value) != std::end(element.second);
});
return (key_it != std::end(map)) ? key_it->first : std::optional<typename MapT::key_type>();
}
int main() {
std::map<int, std::vector<int >> myMap;
std::vector<int> a = {10, 20, 30};
std::vector<int> b = {50, 60, 70};
myMap.insert({1000, a});
myMap.insert({2000, b});
int value_to_search{50};
auto key = find_key_for_value_contained_in_intern_container(value_to_search, myMap);
if (key)
std::cout << "Value " << value_to_search << " is at key " << *key << "\n";
}
如果您需要高效地从值中找到键,相反,您可以使用两个映射。 如果需要,您可以将其封装到单个类中。 然后,您需要为空间搜索的效率付费。 类似的东西:
class DoubleMap {
public:
DoubleMap() {}
void insert(int key, std::vector<int> value) {
myMap1.insert({key, value});
myMap2.insert({value, key});
}
std::vector<int> getValue (int key) {return myMap1[key];}
int getKey(std::vector<int> value) {return myMap2[value];}
private :
std::map <int, std::vector<int>> myMap1;
std::map<std::vector<int>, int> myMap2;
}
不过,除非您确实需要双向搜索的效率,否则我不建议使用这种重型课程。
有没有更漂亮的方法可以在不使用循环的情况下从地图中的向量内部获取值?
您无法避免循环地图。 但是您可以通过使用标准算法来避免编写循环: std::find_if
。
我的意思是更有效率
如果您希望查找有效,那么您选择的数据结构并不好。 您可以改为使用以下内容:
std::unordered_multimap<int, int> myMap{
{10, 1000},
{20, 1000},
{30, 1000},
{50, 2000},
{60, 2000},
{70, 2000},
};
有了这个,查找具有渐近恒定的复杂性而不是线性的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.