【问题标题】:Using C++ std::equal on a container of shared_ptr在 shared_ptr 的容器上使用 C++ std::equal
【发布时间】:2011-03-31 18:49:39
【问题描述】:

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

我需要让一个函数或函数对象传递给equal吗?或者有没有更简单的内置功能(比如 中定义的东西)?

【问题讨论】:

    标签: c++ shared-ptr equality stl-algorithm


    【解决方案1】:

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

    <functional> 中没有任何内容可以帮助您,但 boost 中有一些东西:indirect iterator

    #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:你总是可以编写自己的解引用迭代器,stackoverflow.com/questions/352152/…
    • 酷,我想我仍然会使用函数对象,因为在这种情况下它很简单,但如果我在此之后需要更多类似的功能,这是一个有趣的想法。
    【解决方案2】:

    假设您有一个支持 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);
                   });
    }
    

    【讨论】:

    • 也许最好通过 const 引用传递 shared_ptr,因为复制它们有点贵。
    • @Cubbi 没错,它也不必要地增加了引用计数。修改了代码。
    【解决方案3】:

    我个人认为函数对象是最好的选择......我在&lt;functional&gt; 中看到的所有内容都取决于具有正确的比较类型,这意味着如果您不想比较指针本身,您会以某种方式需要取消引用指向它们指向的对象的那些指针......我没有看到 STL 中的任何助手会自动为您进行取消引用。

    谢谢,

    杰森

    【讨论】:

    • 是的,这就是我想要的,我认为它也不存在,但也许我错过了一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多