簡體   English   中英

在 std::map &lt; int , std::vector 中查找 vector 中元素的值<int > &gt;

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM