В последней части есть некоторые проблемы, вы выбираете столько имен, сколько ввели, не знаю, было ли это предназначено, давайте просто скажем, что это было. Вы добавляете выбранные имена в тот же вектор, вы неправильно проверяете дубликаты.
while (z < amount_of_names) { <-- same amount as was entered in original loop
int random_number = (rand() % amount_of_names);
if (vectornames.at(random_number) != vectornames.at(z)) { <--- doesn't check for duplicates
cout << "Hello ";
cout << vectornames.at(z);
cout << "! You will get " << vectornames.at(random_number) << "\n";
vectornames.push_back(vectornames.at(random_number)); <---- adding to same vector
getch();
z++;
}
}
Давайте посмотрим, что можно сделать без использования алгоритмов ... это означает, что нам нужно реализовать std::find
или используйте другую структуру для проверки того, что уже выбрано.
!!! Предупреждение непроверенный код !!!
bool Find(const std::string& needle, const std::vector<std::string>& haystack) const {
for(const auto& straw : haystack) {
if (straw == needle) {
return true;
}
}
return false;
}
И обновленный код, который использует другой вектор для хранения использованных имена.
std::vector<std::string> used;
while (z < amount_of_names) {
int random_number = (rand() % amount_of_names);
if (!Find(vectornames.at(random_number), used)) {
cout << "Hello ";
cout << vectornames.at(z);
cout << "! You will get " << vectornames.at(random_number) << "\n";
used.push_back(vectornames.at(random_number));
getch();
z++;
}
}