Среди вещей не так в обновленном посте.
- Неправильное использование
sizeof
- Изобретая стандартный алгоритм
- Отсутствие проверки ошибок
Рассмотрите задачи, которые вы пытаетесь выполнить. Вы хотите:
- Инициализировать начальный вектор, содержащий имя Bart
Постоянно читайте новые имена. Для каждого нового имени читать:
а. Проверьте, находится ли он уже в векторе.
- если он есть, завершить цикл чтения
- иначе добавьте его к вектору и напечатайте весь вектор
Эта последовательность операций может быть выполнена с пошаговым уточнением.
Шаг 1. Чтение имен
Во-первых, вы должны иметь возможность постоянно читать имена:
#include <iostream>
#include <string>
int main()
{
std::string name;
while (std::getline(std::cin, name))
std::cout << name << '\n';
}
Достаточно просто. Выполнение этого будет повторять любые строки, которые вы вводите, по одной, разделенные символами новой строки.
Шаг 2. Накопление имен в векторе
Далее нам нужно добавить вектор для хранения строк, которые мы читаем, с начальной популяцией имени «Барт». Для этого прохода мы будем просто помещать каждую строку, которую мы читаем, в вектор
#include <iostream>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> names = { "Bart" };
std::string name;
while (std::getline(std::cin, name))
{
names.emplace_back(name);
for (auto const& s : names)
std::cout << s << ' ';
std::cout.put('\n');
}
}
В дополнение к тому, что было сделано ранее, мы теперь накапливаем строки в векторе, включая дубликаты, и отчитываемся о векторном содержимом после каждого чтения имени. Это приближает нас к нашей заявленной цели.
Шаг 3: Условный выход из цикла на основе обнаружения дубликатов
Теперь нам нужно проверить наличие дубликатов и завершить цикл, как только это произойдет. Мы можем сделать это используя std::find
. Финальный код ниже:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> names = { "Bart" };
std::string name;
while (std::getline(std::cin, name))
{
if (std::find(names.begin(), names.end(), name) != names.end())
break;
names.emplace_back(name);
for (auto const& s : names)
std::cout << s << ' ';
std::cout.put('\n');
}
}
Вот и все. Это простая задача, но она прекрасно подходит для примера того, как разбить задачу, состоящую из нескольких частей, на управляемые цели, а затем собрать ее по частям.
Надеюсь, вы нашли это полезным.