【问题标题】:How to use find algorithm with a vector of pointers to objects in c++?如何在 C++ 中使用带有指向对象的指针向量的查找算法?
【发布时间】:2010-09-20 12:10:50
【问题描述】:

我想在对象指针向量中找到匹配对象。这是一个示例代码来说明我的问题:

class A {
public:
    A(string a):_a(a) {}
    bool operator==(const A& p) {
        return p._a == _a; 
    }

private: 
    string _a;
};

vector<A*> va;

va.push_back(new A("one"));
va.push_back(new A("two"));
va.push_back(new A("three"));

find(va.begin(), va.end(), new A("two"));

我想找到推入向量中的第二个项目。但是由于vector被定义为一个指针集合,C++并没有使用我的重载运算符,而是使用隐式指针比较。在这种情况下,首选的 C++ 解决方案是什么?

【问题讨论】:

    标签: c++ algorithm stl pointers vector


    【解决方案1】:

    将 find_if 与仿函数一起使用:

    template <typename T>
    struct pointer_values_equal
    {
        const T* to_find;
    
        bool operator()(const T* other) const
        {
            return *to_find == *other;
        }
    };
    
    
    // usage:
    void test(const vector<A*>& va)
    {
        A* to_find = new A("two");
        pointer_values_equal<A> eq = { to_find };
        find_if(va.begin(), va.end(), eq);
        // don't forget to delete A!
    }
    

    注意:A 的 operator== 应该是 const,或者,更好的是,将其写为非成员友元函数。

    【讨论】:

    • 确实——你只能 std::find() 谓词容器中的谓词!
    • james 你能在这一行添加更多解释吗 pointer_values_equal eq = { to_find };
    • yesraaj:pointer_values_equal 是一个聚合(没有私有数据、基、虚函数、构造函数),因此可以使用 {}(数组样式)初始化来初始化。
    【解决方案2】:

    要么使用 std::find_if 并自己提供合适的谓词,请参阅其他答案以获取此示例。

    或者作为替代方案查看boost::ptr_vector,它提供对真正存储为指针的元素的透明引用访问(作为额外奖励,内存管理也为您处理)

    【讨论】:

      【解决方案3】:

      尝试改用 find_if。它有一个谓词参数,您可以在其中准确决定如何检查是否找到了正确的元素。

      http://www.sgi.com/tech/stl/find_if.html

      【讨论】:

        【解决方案4】:

        你也可以使用 Boost::Lambda:

        using namespace boost::lambda;
        find_if(va.begin(), va.end(), *_1 == A("two"));
        

        当然,您应该更喜欢使用 shared_ptrs,这样您就不必记得删除了!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-27
          • 2011-10-01
          • 1970-01-01
          • 2014-01-02
          • 2011-02-11
          • 1970-01-01
          • 2010-10-24
          相关资源
          最近更新 更多