У меня есть вектор, который содержит имена пользователей и пароли. Я пытаюсь выполнить функцию "сбросить новый пароль", в результате чего я сначала ищу имя пользователя в векторе, существовало ли имя пользователя, а затем пользователю будет предложено ввести новый пароль, а старый пароль будет заменен на новый.
но я столкнулся с этой ошибкой
Invalid operands to binary expression ('User' and 'const std::__1::basic_string<char>')
Из-за этой линии.
replace(userDetails.begin(), userDetails.end(), oldPassword, newPassword);
часть моих кодов, связанных с проблемой
string name;
cout << "Please enter a user name that the password will be reset \n";
cin >> name;
for (int i =0; i<userDetails.size(); i++) {
if (userDetails[i].getUserName() == name) {
string newPassword;
string oldPassword;
oldPassword = userDetails[i].getPassword();
cout << "Please enter a new password" << endl;
cin >> newPassword;
replace(userDetails.begin(), userDetails.end(), oldPassword, newPassword);
cout << userDetails[i].getPassword();
}
}
Я не уверен, что я должен сделать, чтобы достичь желаемых результатов. Пожалуйста помоги. благодаря
Первая проблема в строке
replace(userDetails.begin(), userDetails.end(), oldPassword, newPassword);
вы пытаетесь заменить объект User
объектом std::string
.
Вторая проблема (как упоминалось в работе nm) - вам не нужно использовать функции на основе диапазона (replace()
или другие) внутри цикла, когда вы уже имеете руки на соответствующем объекте User
.
Вы можете использовать std::find_if()
чтобы найти объект User
с собственным именем вместо написания цикла. В С++ 11 это возможно следующим образом:
auto user = find_if(userDetails.begin(), userDetails.end(),
[&name](const User& u){return u.getUserName()==name;});
В коде pre С++ 11 вам понадобится отдельная предикатная функция вместо лямбда/собственного цикла поиска (просто break;
когда пользователь будет найден).
Если пользователь найден, вы можете установить пароль:
if(user != userDetails.end()){
// (ask for the new password here)
user->setPassword(newPassword); // assuming you have a setter for password field
}
Кажется, что в вашем контейнере userDetails
хранятся объекты User
, но вы рассматриваете его так, как будто он содержит std::string
s. Вы должны заменить пароль userDetails[i]
. Как это сделать, это зависит от деталей класса User
.
Вероятно, вы хотите что-то подобное, используя std::find_if
с подходящим предикатом, чтобы найти первого пользователя с именем пользователя, равным name
:
// find the right User
auto it = std::find_if(userDetails.begin(),
userDetails.end(),
[&name](const User& user)
{ return user.getUserName() == name;})
затем замените пароль для этого пользователя:
if (it != userDetails.end()) {
// we found a user with username == name
it->setPasswd(newPasswd);
} else
// no user found with that username
std::cout << "User " << name << " not found" << std::endl;
}
*Password
вfoo
иbar
. Оскорбительная строка все еще заменяет то же самое, что и раньше? Просмотр фактической документации дляstd::replace
также может помочь.