станд :: unordered_map <Foo, Bar> проверить, присутствует ли конкретная клавиша Foo

80
6

У меня есть неупорядоченная карта объектов Foo, и я хотел бы эффективно протестировать, если набор ключей содержит объекты Foo с заданным идентификатором.

Одним из способов было бы создать объект Foo и установить его id в значение запроса, но мне интересно, есть ли более элегантный способ достичь этого (может быть, с другой структурой данных)?

class Foo {

public:
int id;
};

namespace std
{
template<>
struct hash<Foo> {
std::size_t operator()(Foo const& f) const {
return std::hash<int>()(f.id);
}
};

template<>
struct equal_to<Foo> {
bool operator()(const Foo &lhs, const Foo &rhs) const {
return lhs.id == rhs.id;
}
};
}

int main() {

unordered_map<Foo, int> dict;

Foo f;
f.id = 123;

dict[f] = 1;

//How to test if Foo object with id x is present in dict?

}

спросил(а) 2016-07-19T22:40:00+03:00 4 года, 2 месяца назад
1
Решение
81

Нет, нет более эффективного способа, чем создание объекта Foo с id который вы хотите протестировать с помощью этой текущей коллекции. Вы "застреваете", используя тот тип ключа, который вы выбрали в первую очередь.

Если вы хотите индексировать словарь по свойству int, подумайте о том, чтобы сделать это свойство ключевым и иметь объектную часть Foo значения. (Это может выглядеть как unordered_map<int, pair<Foo, int>> в этом случае.)

ответил(а) 2016-07-19T23:44:00+03:00 4 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема