Точное сравнение в поиске множества - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть структура (скажем, Foo), которая содержит просто строки и двойное число, и я создал набор, который также имеет класс компаратора, который сравнивает подмножество этих атрибутов.Поэтому моя декларация выглядит следующим образом: std::set<Foo, FooComp>

Когда я позвоню find(), я буду ожидать, что все атрибуты Foo будут использоваться в качестве ключа, или будет использоваться FooComp?Я предполагаю первое.

Причина, по которой я спрашиваю, состоит в том, что у меня возникла проблема, когда ранее добавленный объект не обнаруживается в наборе, хотя я и пытался использовать find() чтобы проверить его наличие.Я могу только предположить, что это произошло, поскольку, возможно, была небольшая разница в дабле?Атрибут double не используется в компараторе, но, предположительно, является частью ключа.

Любые мысли будут высоко оценены.

Ответы [ 4 ]

2 голосов
/ 10 февраля 2011

FooComp должен представлять двоичную функцию, которая берет 2 ссылки на Foo и определяет, является ли левая логически меньше, чем правая.

struct FooComp
{
  bool operator()( const Foo& left, const Foo& right ) const;
};

и реализует operator () с "строгим порядком", таким образом

  • !FooComp( foo1, foo1 )
  • FooComp( foo1, foo2 ) => !FooComp( foo2, foo1 )
  • FooComp( foo1, foo2 ) && FooComp( foo2, foo3 ) => FooComp( foo1, foo3 )

Фактически, первая аксиома может быть выведена из второй, поэтому вам нужны только 2-я и 3-я аксиомы.

1 голос
/ 10 февраля 2011

std::set::find() будет использовать FooComp, поскольку двойное не является частью этого сравнения, все должно быть в порядке.

std::find требует operator==, так что, опять же, зависит, если вы определили это и то, что оно включает, если оно не включает в себя двойное (или включает в себя двойное разумным образом), тогда вы хорошо .

Итак, зависит, как выглядит FooComp и какой find вы называете ...

1 голос
/ 10 февраля 2011

Класс сравнения будет использоваться для поддержки сортировки set и find().

1 голос
/ 10 февраля 2011

Компаратор будет использоваться для поиска указанного элемента в наборе.

...