如何在c ++中使用带有指针对象向量的find算法?

时间:2008-11-03 14:51:11

标签: c++ algorithm stl pointers vector

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

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 ++ - 在这种情况下解决方案的方式?

4 个答案:

答案 0 :(得分:17)

将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应该是const,或者更好的是,将其写为非成员朋友函数。

答案 1 :(得分:4)

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

或者作为另一种选择,请查看boost::ptr_vector,它提供对实际存储为指针的元素的透明引用访问(作为额外的奖励,也为您处理内存管理)

答案 2 :(得分:1)

请尝试使用find_if。它有一个谓词参数,你可以确定如何确定你找到正确的元素。

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

答案 3 :(得分:1)

你也可以使用Boost :: Lambda:

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

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