提问人:Jose Ignacio Contreras Mendez 提问时间:8/6/2023 最后编辑:Jose Ignacio Contreras Mendez 更新时间:8/8/2023 访问量:74
我想使用查找功能查看对象是否在矢量内,但我不能
I want to look if an object is inside a vector using find but I can't
问:
我一直在尝试用它来寻找里面的对象,但它告诉我要使运算符过载,我不知道该怎么做find
vector
¿在我的代码中如何重载运算符,以便“查找”功能起作用?
¿如何使用 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;
};
我将不胜感激对我做错了什么的任何反馈:
答:
我一直在尝试使用 find 在向量中查找对象,但它告诉我要重载运算符,我不知道该怎么做
你可以在类中添加一个函数,但它可能不会帮助你解决这个问题。您真正需要的是一种仅根据用户找到用户的方法。为此,我认为@PaulMcKenzie和@Some程序员提供的解决方案是最直接的。operator==
User
username
更改为 ,并使用 lambda 进行检查,将得到以下结果:find
find_if
username
auto it = find_if(U1.UsersDatabase.begin(), U1.UsersDatabase.end(),
[&](User const& u) {
return username == u.get_username();
}
);
所以,这就是你问题的答案。但这本身是行不通的。在您的班级中,是私人成员。您需要一个公共的“getter”函数才能使其可用。我把这个函数添加到了类中。它由上面的 lambda 调用。User
username
User
public:
std::string get_username() const {
return username;
}
此外,您需要传递对任何需要它的函数的引用。在函数中将 different 声明为局部变量是错误的。 应该是函数的参考参数,而不是局部变量:U1
StorageVector
NewUser
vec1
NewUser
void NewUser(StorageVector& vec1) {
// ...
}
调用 时,请作为参数 include : 。NewUser
U1
NewUser(U1)
最后,你有没有注意到你的测试是倒退的?如果您尝试检测新用户,则应使用它。if (it != U1.UsersDatabase.end()) ...
==
评论
find
:用。另外,是什么让两个相等?这就是编译器不能做到这一点的一般原因——没有规则说明是什么让一个等于另一个。std::find_if
User
User
User
std::find_if
的 lambda(这是我在您的情况下推荐的解决方案。User
operator==
User
auto operator<=>(const User&) const = default;
User