我想使用查找功能查看对象是否在矢量内,但我不能

I want to look if an object is inside a vector using find but I can't

提问人:Jose Ignacio Contreras Mendez 提问时间:8/6/2023 最后编辑:Jose Ignacio Contreras Mendez 更新时间:8/8/2023 访问量:74

问:

我一直在尝试用它来寻找里面的对象,但它告诉我要使运算符过载,我不知道该怎么做findvector

¿在我的代码中如何重载运算符,以便“查找”功能起作用? ¿如何使用 an 查看我的对象是否在向量内?==if

对于更多上下文,我想将输入(用户名、密码)放入一个对象中,然后进行比较以查看该对象是否在向量内以登录,如果没有,请创建一个新用户。

首先,这是我的主要代码,我尝试获取用户和密码,然后查看用户是否在那里登录,但如果用户不在那里,我想调用一个函数将该用户添加到向量中。vector

#include <iostream>
#include "users.h"
using namespace std;


void NewUser(){
    StorageVector vec1;
    string username, password;
    cout << "-------- REGISTER NEW USER --------" << "----------------------------------" << endl;
    cout << "Give me the username: ";
    cin >> username;
    cout << "Give me your password: ";
    cin >> password;
    vec1.UsersDatabase.push_back(User(username, password));
}

int main(){
    StorageVector U1;

    string password, username;

    cout << "  STUDENTS MANAGEMENT SYSTEM " << endl;
    cout << "------------------------------" << endl;
    cout << "            LOGIN              " << endl;
    cout << "--> Username: " << endl;
    cin >> username;
    cout << "--> Password: " << endl;
    cin >> password;
    auto it = find(U1.UsersDatabase.begin(), U1.UsersDatabase.end(), User(username,password) );
    if(it != U1.UsersDatabase.end()){
        cout << "User not found! redirecting..." << endl;
        NewUser();
    }

}

然后在我的第二个文件中,我的头文件是我有两个类的地方,一个用于我的对象,一个用于我的向量。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//class for my object

class User{

    private:
        string username, password;

    public:
        User(string new_username, string new_password): username(new_username), password(new_password){}

};

class StorageVector{
    public:
        vector <User> UsersDatabase;
};

我将不胜感激对我做错了什么的任何反馈:

C++ 对象 向量

评论

0赞 PaulMcKenzie 8/6/2023
find:用。另外,是什么让两个相等?这就是编译器不能做到这一点的一般原因——没有规则说明是什么让一个等于另一个。std::find_ifUserUserUser
1赞 Some programmer dude 8/6/2023
你需要某种方法来比较对象是否相等才能找到它。或者使用带有 std::find_iflambda(这是我在您的情况下推荐的解决方案。User
0赞 tbxfreeware 8/6/2023
大多数登录程序首先搜索用户名,而不检查密码。如果用户名在文件中,则他们检查密码。这就是为什么你不能简单地在类中定义明显的函数。该函数通常会比较用户名和密码。请注意,在复制 ctor 中复制的内容与在相等运算符中比较的内容之间的联系。通常,它们是相同的。如果您复制某些内容,则副本应与原件相同。所以,我喜欢@Some程序员家伙提供的解决方案:通过一个 lamda 来做你需要的比较。operator==User
1赞 Ted Lyngmo 8/6/2023
搭。auto operator<=>(const User&) const = default;User
0赞 tbxfreeware 8/6/2023
@Ted Lyngmo:这是否意味着每当用户输入密码时出错时,就会创建一个新用户?

答:

0赞 tbxfreeware 8/6/2023 #1

我一直在尝试使用 find 在向量中查找对象,但它告诉我要重载运算符,我不知道该怎么做

你可以在类中添加一个函数,但它可能不会帮助你解决这个问题。您真正需要的是一种仅根据用户找到用户的方法。为此,我认为@PaulMcKenzie和@Some程序员提供的解决方案是最直接的。operator==Userusername

更改为 ,并使用 lambda 进行检查,将得到以下结果:findfind_ifusername

    auto it = find_if(U1.UsersDatabase.begin(), U1.UsersDatabase.end(), 
        [&](User const& u) {
            return username == u.get_username();
        }
    );

所以,这就是你问题的答案。但这本身是行不通的。在您的班级中,是私人成员。您需要一个公共的“getter”函数才能使其可用。我把这个函数添加到了类中。它由上面的 lambda 调用。UserusernameUser

public:
    std::string get_username() const {
        return username;
    }

此外,您需要传递对任何需要它的函数的引用。在函数中将 different 声明为局部变量是错误的。 应该是函数的参考参数,而不是局部变量:U1StorageVectorNewUservec1NewUser

void NewUser(StorageVector& vec1) {
    // ...
}

调用 时,请作为参数 include : 。NewUserU1NewUser(U1)

最后,你有没有注意到你的测试是倒退的?如果您尝试检测新用户,则应使用它。if (it != U1.UsersDatabase.end()) ...==

评论

0赞 Jose Ignacio Contreras Mendez 8/8/2023
非常感谢你,它真的帮助我保持头脑清晰!!!!
0赞 tbxfreeware 8/8/2023
@Jose 伊格纳西奥·孔特雷拉斯·门德斯(Ignacio Contreras Mendez):能够帮助一个刚接触C++的程序员,我感到非常高兴。你的问题让这变得简单。很多时候,初学者的问题不清晰,没有重点。你们这些新人是未来,我们需要尽我们所能来支持你们。