C ++: сравнение ptr_container - PullRequest
       7

C ++: сравнение ptr_container

1 голос
/ 09 октября 2010

Как я могу настроить сравнение элементов в ptr_container? Используя ptr_set, я хотел бы определить функцию, которая проверяет равенство элементов. Тем не менее, определение

bool operator==(const Foo& other) (or a friend function)

не работает. Он просто не будет вызываться, хотя неупорядоченные контейнеры boost, с другой стороны, знают о перегруженных операторах == s. Предикаты а-ля:

struct FooEq
{
    bool operator()(const Foo& foo1, const Foo& foo2) const
};

тоже не работает, и я не могу найти ссылку, которая описывает, как это сделать.

struct Foo
{
    Foo(int i, int j) : _i(i), _j(j) {}

    bool operator<(const Foo& other) const { return this->_i < other._i; }

    bool operator==(const Foo& other) const
    {
        std::cout << "== involed";

        return this->_j == other._j;
    }

    int _i;
    int _j;
};

boost::ptr_set<Foo> foos;
std::cout << foos.size() << "\n";
foos.insert(new Foo(1, 2));
std::cout << foos.size() << "\n";
foos.insert(new Foo(2, 2));
std::cout << foos.size() << "\n";

Предполагается, что foos равны, поскольку для обоих j == 2 выполнено.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 09 октября 2010

Set использует оператор <для вставки элементов и проверки на эквивалентность (что не совсем совпадает с равенством).Этот оператор должен определять строгий слабый порядок.Set не будет использовать оператор ==. </p>

Цитируется из описания для set:

Сравнение: Класс сравнения: класс, который принимает два аргумента того же типа, что и элементы контейнера.и возвращает бул.Выражение comp (a, b), где comp - это объект этого класса сравнения, а a и b - элементы контейнера, должно возвращать true, если a нужно поместить в более раннюю позицию, чем b, в операции строгого слабого упорядочения.Это может быть либо класс, реализующий оператор вызова функции, либо указатель на функцию (см. Пример в конструкторе).По умолчанию используется значение less, которое возвращает то же самое, что и применение оператора less-a (

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

0 голосов
/ 09 октября 2010

Я не мог точно понять вашу ситуацию. Тем не менее, вы можете использовать std :: set. Это не поддерживает дублирование.

set<shared_ptr<T>> 

действительно полезно в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...