Можно ли искать на карте все пары ключ-значение, которые содержат часть кортежа в C ++
Например, у меня есть неупорядоченная мультикарта, которая использует кортеж в качестве ключа, но я хочу поискать кортеж из:
<«abc», не имеет значения, не имеет значения>
Я посмотрел на диапазон равных и функцию равных, но я не думаю, что это то, что я ищу. Я почти уверен, что мог бы просто перебрать всю карту, используя дальний цикл for, но я бы предпочел этого не делать, если это возможно.
Так как кортеж генерирует хеш, используя все объекты, которые он хранит, вы не можете сделать это только с оригинальной картой. Вы могли бы сделать:
std::unordered_map<std::string, std::tuple< /*type here*/ > *> mapToMap;
Который вы можете использовать для хранения другой карты, которую вы можете использовать для поиска кортежа.
Вы могли бы использовать 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