如何使用std :: find / std :: find_if与自定义类对象的向量?

时间:2011-08-04 09:37:08

标签: stl stl-algorithm c++

我有一个代表名为Nick的用户的类,我想在其上使用std::find_if,我想查找用户列表向量是否包含我传入的相同用户名的对象。尝试为我要测试的用户名创建一个新的Nick对象并重载== operator,然后尝试在对象上使用find/find_if,我做了几次尝试:

    std::vector<Nick> userlist;
    std::string username = "Nicholas";

if (std::find(userlist.begin(), userlist.end(), new Nick(username, false)) != userlist.end())) {
    std::cout << "found";
}

我已经超载了== operator所以比较Nick == Nick2应该有效,但函数返回error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Nick' (or there is no acceptable conversion)

这是我的Nick课程供参考:

class Nick {
private:
    Nick() {
        username = interest = email = "";
                    is_op = false;
    };
public:
    std::string username;
    std::string interest;
    std::string email;
    bool is_op;

    Nick(std::string d_username, std::string d_interest, std::string d_email, bool d_is_op) {
        Nick();
        username = d_username;
        interest = d_interest;
        email = d_email;
        is_op = d_is_op;
    };
    Nick(std::string d_username, bool d_is_op) {
        Nick();
        username = d_username;
        is_op = d_is_op;
    };
    friend bool operator== (Nick &n1, Nick &n2) {
        return (n1.username == n2.username);
    };
    friend bool operator!= (Nick &n1, Nick &n2) {
        return !(n1 == n2);
    };
};

6 个答案:

答案 0 :(得分:38)

答案 1 :(得分:16)

答案 2 :(得分:9)

答案 3 :(得分:3)

您正在将指针传递给find函数。放弃新的:

std::find(userlist.begin(), userlist.end(), Nick(username, false))

此外,您的运算符应该通过const引用接受它们的参数,它们不会修改它们。

bool operator== (const Nick &n1, const Nick &n2)

答案 4 :(得分:1)

我注意到你试图以这种方式从另一个构建者调用一个构造函数:

Nick(std::string d_username, bool d_is_op) {
        Nick();
 ...

嗯,抱歉,但这不起作用。第Nick()行只会创建一个临时版,但不会影响this。构造函数转发只能在C ++ 0x(即将推出的标准)

中进行

关于你的问题 - 这个问题在几天前就二元研究提出了相同的理由。最好的答案是真棒。

Mystical restriction on std::binary_search

HTH。

P.S。理想情况下,这应该是一个评论,但它太冗长了

答案 5 :(得分:0)

您可以使用boost :: bind

std::find_if( userlist.begin(), userlist.end(),
            boost::bind( & Nick::isFound,
                         _1 ) );

只需实现bool Nick :: isFound()

您也可以传递标准

std::find_if( userlist.begin(), userlist.end(),
              boost::bind( & Nick::compare,
                           _1,
                           nick ) );

实施

bool Nick::compare( const Nick & nick )
{
    return this->username == nick.username;
}