Использование C ++ std :: равно в контейнере shared_ptr - PullRequest
4 голосов
/ 31 марта 2011

У меня есть контейнер std :: shared_ptr. Я хочу сравнить два контейнера, используя std :: equal. Класс A имеет оператор == определенный. Я хочу сравнить, если каждый элемент эквивалентен, используя его оператор ==, а не тот, который определен в shared_ptr.

Нужно ли сделать функцию или объект-функцию равными? Или есть что-то встроенное, что было бы проще (например, определенное в )?

Ответы [ 3 ]

7 голосов
/ 31 марта 2011

Вам понадобится функция, функциональный объект или лямбда-выражение (поскольку вы можете использовать std::shared_ptr, у вас уже включена часть C ++ 0x).

В <functional> нет ничего, что могло бы вам помочь, но есть что-то стимулирующее: косвенный итератор

#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>
#include <boost/iterator/indirect_iterator.hpp>
int main()
{
        std::vector<std::shared_ptr<int>> v1;
        std::vector<std::shared_ptr<int>> v2;
        v1.emplace_back( new int(1) );
        v2.emplace_back( new int(1) );

        bool result =
            std::equal( boost::make_indirect_iterator(v1.begin()),
                        boost::make_indirect_iterator(v1.end()),
                        boost::make_indirect_iterator(v2.begin()));
        std::cout << std::boolalpha << result << '\n';
}
4 голосов
/ 31 марта 2011

Вы могли бы сделать что-то вроде следующего, предполагая, что у вас есть компилятор, который поддерживает лямбды, и что никакие элементы никогда не равны нулю:

bool CompareA(const vector<shared_ptr<A>>& first, 
              const vector<shared_ptr<A>>& second) {

   return equal(first.begin(), first.end(), second.begin(),
              [](const shared_ptr<A>& item1, const shared_ptr<A>& item2) -> bool{
                   return (*item1 == *item2);
               });
}
0 голосов
/ 31 марта 2011

Лично я думаю, что функциональный объект был бы лучшим выбором ... все, что я видел в <functional>, зависит от правильного типа сравнения, и это означало бы, если вы не хотите сравниватьсами указатели, что вам как-то понадобится разыменование этих указателей на объекты, на которые они указывают ... Я не вижу никаких помощников в STL, которые бы автоматически делали эту разыскивание для вас.

Спасибо,

Джейсон

...