Вам необходимо предоставить обратное сопоставление. Существует несколько способов сделать это, в том числе multimap
, но простой подход, если ваше сопоставление не изменяется после создания, это перебирать по карте и создавать обратное сопоставление. В обратном сопоставлении вы сопоставляете значение -> список ключей.
В приведенном ниже коде используется std::unordered_map
, чтобы нанести на карту std::pair<int, int>
(значение на исходной карте) до std::vector<int>
(список ключей на исходной карте).Здание обратного отображения является простым и лаконичным:
std::unordered_map<Point, std::vector<int>, hash> r;
for (const auto& item : m) {
r[item.second].push_back(item.first);
}
(Смотрите полный пример для определения hash
).
Не нужно беспокоиться о том, существует ли ключ; он будет создан (и вектор идентификаторов будет инициализирован как пустой вектор), когда вы попытаетесь получить доступ к этому ключу, используя нотацию r[key]
.
Это решение ориентировано на простоту; это приемлемое решение, если вам нужно это сделать и не заботясь о производительности, использовании памяти или использовании сторонних библиотек, таких как Boost.
Если вы заботитесь обо всех этих вещах или изменяете карту при выполнении поиска в обоих направлениях, вам следует, вероятно, изучить другие варианты.
Live example
#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>
// Define a point type. Use pair<int, int> for simplicity.
using Point = std::pair<int, int>;
// Define a hash function for our point type:
struct hash {
std::size_t operator()(const Point& p) const
{
std::size_t h1 = std::hash<int>{}(p.first);
std::size_t h2 = std::hash<int>{}(p.second);
return h1^(h2 << 1);
}
};
int main() {
// The original forward mapping:
std::map<int, Point> m = {
{1, {2, 3}},
{5, {6, 2}},
{12, {2, 3}},
{54, {4, 4}},
{92, {6, 2}}
};
// Build reverse mapping:
std::unordered_map<Point, std::vector<int>, hash> r;
for (const auto& item : m) {
r[item.second].push_back(item.first);
}
// DEMO: Show all indices for {6, 2}:
Point val1 = {6, 2};
for (const auto& id : r[val1]) {
std::cout << id << " ";
}
std::cout << "\n";
// DEMO: Show all indices for {2, 3}:
Point val2 = {2, 3};
for (const auto& id : r[val2]) {
std::cout << id << " ";
}
std::cout << "\n";
}
обеспечивают некоторые из кода, пожалуйста, – Sugar