5

我有一个 std::shared_ptr 容器。我想使用 std::equal 比较两个容器。A 类定义了 operator==。我想比较每个元素是否使用其运算符 == 等效,而不是在 shared_ptr 中定义的那个。

我需要使函数或函数对象传递给相等吗?还是有一些更简单的内置功能(如 <functional> 中定义的东西)?

4

3 回答 3

7

您将需要一个函数或一个函数对象或一个 lambda 表达式(因为您可以使用std::shared_ptr,所以您已经启用了 C++0x 的某些部分)。

没有什么<functional>可以帮助您,但在 boost 中有一些东西:间接迭代器

#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';
}
于 2011-03-31T19:00:05.813 回答
6

您可以执行以下操作,假设您有一个支持 lambdas 的编译器并且没有任何项目为空:

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);
               });
}
于 2011-03-31T18:57:57.200 回答
0

我个人认为函数对象是最好的选择......我所看到的一切都<functional>取决于具有正确的比较类型,这意味着如果你不想比较指针本身,你会不知何故,需要取消引用指向它们指向的对象的那些指针……我在 STL 中没有看到任何自动为您执行取消引用的助手。

谢谢,

杰森

于 2011-03-31T19:01:43.287 回答