Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类向量中迭代导致问题_C++_Vector_Iterator - Fatal编程技术网

C++ 在类向量中迭代导致问题

C++ 在类向量中迭代导致问题,c++,vector,iterator,C++,Vector,Iterator,我的程序正在尝试创建一个新帐户,并将用户名与数据库中的用户名进行比较。一个来自用户输入,另一个来自向量。我必须遍历向量并比较两个字符串。但是由于一些未知的原因,它只比较第一个值,而不是比较向量中的所有值 这是我的代码: 我的LoginAcc.cpp class AccountInfo { public: string username; string password; string type; }; bool LoginAcc::checkAccountNameValid(string u

我的程序正在尝试创建一个新帐户,并将用户名与数据库中的用户名进行比较。一个来自用户输入,另一个来自向量。我必须遍历向量并比较两个字符串。但是由于一些未知的原因,它只比较第一个值,而不是比较向量中的所有值

这是我的代码:
我的LoginAcc.cpp

class AccountInfo {
public:
string username;
string password;
string type;
}; 

bool LoginAcc::checkAccountNameValid(string username) {
vector <AccountInfo> accInfo;
AccountInfo user;

ifstream UserDatabase("UserDatabase.txt");
string line = "";

while (getline(UserDatabase,line)) {
    stringstream linestream(line);

    getline(linestream,user.username,':');

    accInfo.push_back(user);
}

UserDatabase.close();

for(vector<AccountInfo>::iterator itr = accInfo.begin(); itr != accInfo.end(); ++itr) {
    if (username.compare((*itr).username) != 0)
        return true;
    else 
        return false;
}
class AccountInfo{
公众:
字符串用户名;
字符串密码;
字符串类型;
}; 
bool LoginAcc::checkAccountNameValid(字符串用户名){
矢量信息;
AccountInfo用户;
ifstream用户数据库(“UserDatabase.txt”);
字符串行=”;
while(getline(UserDatabase,line)){
线状流线状流(线状);
getline(linestream,user.username,':');
accInfo.push_back(用户);
}
UserDatabase.close();
对于(向量::迭代器itr=accInfo.begin();itr!=accInfo.end();++itr){
if(username.compare((*itr.username)!=0)
返回true;
其他的
返回false;
}
我的main.cpp

        case 'n':
        while (!flag) {
            cout << "Please enter a username with 8 characters. " << endl;
            cout << "Username : ";
            cin >> username;
            if (username.length() != 8) {
                cout << "Username does not meet the requirements" << endl;
                cout << "Username : ";
                cin >> username;
            }
            else {
                valid = login.checkAccountNameValid(username);
                if (valid == true) {
                    cout << "Please enter a password with 8 characters." << endl;
                    cout << "Password : " << endl;
                    cin >> password;
                    cout << "1. Student" << endl;
                    cout << "2. Lecturer" << endl;
                    cout << "3. Admin" << endl;
                    cout << "Please choose the category you belong to : ";
                    cin >> category;
                    login.createNewAcc(username,password,category);
                }
                else {
                    cout << "Username has been taken. Please choose another. " << endl;
                    cout << "Username : ";
                    cin >> username;
                }
            }
        }
        break;
案例“n”:
while(!flag){

cout无论结果如何,内部循环都会返回给调用方。在循环完成后,您应该
返回false

另外,不要使用
username.compare(*itr.username)!=0
。这很让人困惑(可能是你弄错的原因(应该是
==0
),你可以使用相等运算符:
username==itr->username
,这是为
std::string
定义的,以防你担心整个问题,“不要用相等来比较
char*
!”之类的东西)

但您真正应该做的是将数据存储在键入用户名的地图中,并进行直接查找:

std::map<std::string, AccountInfo> accInfo;
⋮
return accInfo.find(username) != accInfo.end();
std::map accInfo;
⋮
返回accInfo.find(用户名)!=accInfo.end();

无论结果如何,内部循环都会返回给调用方。在循环完成后,您应该
返回false

另外,不要使用
username.compare(*itr.username)!=0
。这很让人困惑(可能是你弄错的原因(应该是
==0
),你可以使用相等运算符:
username==itr->username
,这是为
std::string
定义的,以防你担心整个问题,“不要用相等的东西来比较
char*

但您真正应该做的是将数据存储在键入用户名的地图中,并进行直接查找:

std::map<std::string, AccountInfo> accInfo;
⋮
return accInfo.find(username) != accInfo.end();
std::map accInfo;
⋮
返回accInfo.find(用户名)!=accInfo.end();
更现代的方法是

bool found = std::find_if(accInfo.begin(), accInfo.end(), 
   [] (AccountInfo const& ai) { return username == ai.username; });
或者实际上,使用一种便于查找的数据结构,如另一个答案中所示的
std::map

更现代的方法是

bool found = std::find_if(accInfo.begin(), accInfo.end(), 
   [] (AccountInfo const& ai) { return username == ai.username; });


或者确实,使用便于查找的数据结构,如另一个答案中所示的
std::map

如果只计算向量中的一项,则第一项返回true或false。这可能不是您想要的。@JoachimPileborg我试图做的是,当用户输入用户名时,我会比较它根据我数据库中已有的用户名列表。然后,如果在数据库中找不到用户输入的用户名,这意味着该用户名对用户使用是有效的。好的,但如果找到匹配项,则应在循环中返回false,如果知道找不到匹配项,则在循环后返回true。@JoachimPileborg Ur return true after loop是指for循环之后?@JoelSeah仅在
true
情况下返回,然后在循环之后,您可以说
return false
,因为您没有找到您要查找的内容。您只对向量中的一项求值,在第一项上返回true或false。这可能不是您想要的。@JoacHimpileberg我想做的是,当用户输入用户名时,我会将其与我数据库中已有的用户名列表进行比较。然后,如果在数据库中找不到用户输入的用户名,这意味着该用户名对用户是有效的。好的,但是如果匹配,那么在循环中应该返回falsed、 当你知道没有找到匹配项时,在循环后返回true。@JoachimPileborg Ur return true after loop指的是在for循环后?@JoelSeah只在
true
情况下返回,然后在你的循环后,你可以说
return false
,因为你没有找到你要查找的内容。循环的return false完成了吗你的意思是?@JoelSeah:我写了“…在循环完成后”。返回循环完成后的false?你这是什么意思?@JoelSeah:我写了“…在循环完成后”。不想去范围吗?不,我不想。OP已经表明他很难理解这是如何工作的(另见Lounge)此外,另一个答案显示了使用
std::map
already@sehe我现在明白了。是if-else分支中返回值的bcoz使它在向量的第一项处停止。谢谢!不需要范围吗?不,我不需要。OP已经表明他很难理解这是如何工作的(另请参见Lounge)此外,另一个答案显示了使用
std::map
already@sehe我现在明白了。它在if-else的分支中返回值的bcoz使它在向量的第一项处停止。谢谢!