2017-02-02 2 views
1

Ist es möglich, eine Karte für alle Schlüssel, Wert-Paare zu suchen, den Teil eines Tupels in C enthält ++Suche Karte für einen Teil eines Tupels als Schlüssel

Zum Beispiel, ich habe eine ungeordnete multimap, die ein Tupel verwendet von als Schlüssel, aber ich möchte nach einem Tupel suchen: < "abc", ist egal, spielt keine Rolle>

Ich habe den Gleichstand betrachtet und entspricht der Funktion, aber ich don ' Ich glaube, es ist das, wonach ich suche. Ich bin mir ziemlich sicher, dass ich die gesamte Karte mit einer Entfernungsschleife durchlaufen kann, aber das mache ich lieber nicht.

Antwort

1

Da Tupel einen Hash generiert, indem alle Objekte verwendet werden, die Sie speichern, können Sie dies nicht mit der ursprünglichen Map tun. Sie könnten tun:

std::unordered_map<std::string, std::tuple< /*type here*/ > *> mapToMap; 

Die Sie verwenden können, um eine andere Karte zu speichern, die Sie zum Nachschlagen des Tupels verwenden können.

0

Sie können std::for_each verwenden, um eine lineare Suche auf Ihrer Karte durchzuführen.

#include <map> 
#include <algorithm> 
#include <vector> 
#include <tuple> 

int main() 
{ 
    using MyTuple = std::tuple<std::string, int, int>; 
    std::multimap<MyTuple, int> myMultimap; 

    myMultimap.emplace(std::make_tuple("abc", 0, 0), 0); 
    myMultimap.emplace(std::make_tuple("abc", 1, 5), 1); 
    myMultimap.emplace(std::make_tuple("abc", 4, 2), 2); 
    myMultimap.emplace(std::make_tuple("bbb", 0, 0), 3); 
    myMultimap.emplace(std::make_tuple("ccc", 0, 0), 4); 

    std::vector<int> searchResult; 

    std::for_each(myMultimap.begin(), myMultimap.end(), 
     [&searchResult](std::pair<const MyTuple, int>& element) 
    { 
     if (std::get<0>(element.first).compare("abc") == 0) 
     { 
      searchResult.push_back(element.second); 
     } 
    }); 

    for (auto key : searchResult) 
    { 
     std::cout << key << std::endl; 
    } 
    return 0; 
} 

Das wird über Code drucken:

0 
1 
2 
Verwandte Themen