在一个 shared_ptr 容器上使用 C++ 的 std::equal 函数

6
我有一个std::shared_ptr容器。我想使用std::equal比较两个容器。类A定义了operator==。我希望equal使用元素的operator==比较它们是否相等,而不是使用shared_ptr中定义的operator==。
我需要创建一个函数或函数对象来传递给equal吗?还是有内置的更简单的东西(例如在中定义的内容)?
3个回答

7
假设您有一个支持lambda表达式且没有任何项目为空的编译器,您可以尝试以下操作:
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);
               });
}

1
也许最好通过const引用传递shared_ptr,因为复制它们有点昂贵。 - Cubbi
@Cubbi 是的,它也不必要地增加了引用计数。代码已更改。 - bsruth

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';
}

谢谢,但我一直在避免添加boost依赖。太糟糕了,那正是我想要的... - Matt
@Matt:你总是可以编写自己的解引用迭代器,https://dev59.com/z3RC5IYBdhLWcg3wRO3k#352162 - Cubbi
很酷,我想我还是会在这种情况下使用函数对象,因为它很简单,但如果我以后需要类似的功能,那是一个有趣的想法。 - Matt

0
我个人认为函数对象可能是最好的选择... 我在<functional> 中看到的一切都取决于拥有正确的比较类型,这意味着如果您不想比较指针本身,那么您需要以某种方式对这些指针进行解引用以获得它们所指向的对象... 我没有看到STL中任何自动为您执行此解引用的助手。
谢谢,
Jason

是的,这就是我想要的,我也没想到它存在,但可能是我漏掉了什么。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接