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

How to use std::find/std::find_if with a vector of custom class objects?(如何将 std::find/std::find_if 与自定义类对象的向量一起使用?)

本文介绍了如何将 std::find/std::find_if 与自定义类对象的向量一起使用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表示名为 Nick 的用户的类,我想在其上使用 std::find_if,我想在其中查找用户列表向量是否有对象包含在我传入的相同用户名中.我尝试为要测试的用户名创建一个新的 Nick 对象并重载 == 运算符 和然后尝试在对象上使用 find/find_if:

I have a class representing a user called Nick and I want to use std::find_if on it, where I want to find if the userlist vector has an object included with the same username I pass in. I did a few attempts by trying to create a new Nick object for the username I want to test and overloading the == operator and then trying to use find/find_if on the object:

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

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

我重载了 == 运算符,所以比较 Nick == Nick2 应该可以工作,但是函数返回 error C2678: binary '==' : no operator found which take a left-'Nick' 类型的手操作数(或没有可接受的转换).

I have overloaded the == operator so comparing Nick == Nick2 should work, but the function returns error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Nick' (or there is no acceptable conversion).

这是我的尼克课供参考:

Here is my Nick class for reference:

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

推荐答案

你必须将 operator== 定义为你的类之外的两个对象,作为工具函数,而不是成员.

You have to define operator== with two Objects outside your class, as a tool function, not a member.

然后为了让它成为朋友,只需将函数的声明放在类中即可.

Then to make it friend just put the declaration of the function inside the class.

尝试这样的事情:

class Nick {

public:
    friend bool operator== ( const Nick &n1, const Nick &n2);
};


bool operator== ( const Nick &n1, const Nick &n2) 
{
        return n1.username == n2.username;
}

您的发现也应如下所示:

Also your find should look like this:

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

不需要新".

这篇关于如何将 std::find/std::find_if 与自定义类对象的向量一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:如何将 std::find/std::find_if 与自定义类对象的向量一起使用?

基础教程推荐