2017-02-02 2 views
1

Можно искать карту для всего ключа, значение пары, которые содержат часть кортежа в C++карта поиска для части кортежа как ключевого

К примеру, у меня есть неупорядоченный Multimap, которая использует кортеж как ключ, но я хочу найти кортеж: < «abc», не имеет значения, не имеет значения>

Я посмотрел на диапазон равных и равную функцию, но я не знаю, я думаю, что это то, что я ищу. Я почти уверен, что могу просто перебирать всю карту с помощью цикла для диапазона, но я бы предпочел не делать этого, если это возможно.

ответ

1

Поскольку tuple генерирует хеш, используя все объекты, которые он хранит, вы не можете сделать это только с исходной карты. Вы можете сделать:

Что вы можете использовать для хранения другой карты, которую вы можете использовать для поиска кортежа.

0

Вы можете использовать std::for_each для выполнения линейного поиска на вашей карте.

#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; 
} 

Приведенный выше код будет печатать:

0 
1 
2