Карта поиска для части кортежа в качестве ключа

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

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

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

1

Решение

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

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

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

2

Другие решения

Вы могли бы использовать 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
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector