Как заполнить вектор с клавиатуры c
Перейти к содержимому

Как заполнить вектор с клавиатуры c

  • автор:

Функции на ввод- вывод векторов и матриц

Набирая программу на C++, нам часто нужно ввести какие- либо данные или вывести их на монитор. Обычно это бывают векторы или матрицы. Есть несколько способов реализации этого. Наиболее приемлемые способы ввода, как мне кажется, это ввод данных при помощи клавиатуры и чтение их из файла(об этом способе читай здесь). Вывод данных может быть произведен как на монитор, так и в файл. Напишем функции для ввода и вывода векторов и матриц.

Функция для ввода вектора:

double * inputv(int n) for(i=0;i< n;i++) cin>>a[i]; return a; >

Функция для вывода вектора:

void outputv(double *a,int n) >

Функция для ввода матрицы:

double ** inputm(int n, int m) for(i=0;i < n;i++) > for(i=0;i< n;i++) >a[i][j]; > return a; >

Функция для вывода матрицы:

void outputm(double **a, int n, int m) >
  • Функции на ввод- вывод
  • Сортировки
  • Чтение и запись векторов в файл
  • Чтение и запись
    матриц в файл
  • Транспонирование матрицы
  • Поиск количества нулевых
    элементов в строке
  • Поиск строки, в которой все
    элементы

Как заполнить вектор C++ входными данными с клавиатуры?

Смех заключается в том, что я пока не знаю размер строки. Мне нужно иметь возможность попросить пользователя о слове, и чтобы это слово было сохранено в векторе.

int main() < vectorword (80); // get the word from user for(int i=0 ; getchar() != '\n' ; i++) < cin >> word[i]; > // print the word from user for(int i=0 ; i return 0; > 

РЕДАКТИРОВАТЬ: Просто я хочу захватить ввод слова с клавиатуры, любое слово вообще, строку символов и т.д. Пример: Допустим, я хочу добавить слово «очевидно» в вектор, чтобы позже я мог манипулировать вектором. Поэтому я ввожу «очевидно», затем нажимаю Enter, и там у меня есть вектор размера 7 с словом «очевидно» в нем.

Поделиться Источник 25 ноября 2012 в 17:07

2 ответа

std::string str; // I'm confused about whether you want a line, or a word. // this gets a line std::getline(std::cin, str); // this gets a word // std::cin >> str; vector word(str.begin(), str.end()); 

Поделиться 25 ноября 2012 в 17:08

Я думаю, что этот вопрос часто задавался и отвечал. Очевидный подход —

std::vector word; 

. или эквивалентная версия, компилируемая с помощью C++ 2003, но настроенная, чтобы избежать наиболее вексируемого разбора.

Если вы хотите просто прочитать частичный ввод, например, только строку, вам нужно немного настроить его:

for (std::istreambuf_iterator it(std::cin), end; it != end && *it != '\n'; ++it) < word.push_back(*it); >++it; 

Ключ в любом случае — позволить std::vector вырасти до нужного размера.

Как заполнить вектор с клавиатуры c

Для добавления элементов в вектор применяется функция push_back() , в которую передается добавляемый элемент:

#include #include int main() < std::vectornumbers; // пустой вектор numbers.push_back(5); numbers.push_back(3); numbers.push_back(10); for(int n : numbers) cout << n << "\t"; // 5 3 10 std::cout

Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.

Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:

std::vector numbers< 1, 2, 3, 4, 5 >; numbers.emplace_back(8); // numbers = < 1, 2, 3, 4, 5, 8 >;

Добавление элементов на определенную позицию

Ряд функций позволяет добавлять элементы на определенную позицию.

  • emplace(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos
  • insert(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace
  • insert(pos, n, value) : вставляет n элементов value начиная с позиции, на которую указывает итератор pos
  • insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end
  • insert(pos, values) : вставляет список значений начиная с позиции, на которую указывает итератор pos
std::vector numbers< 1, 2, 3, 4, 5 >; auto iter = numbers.cbegin(); // константный итератор указывает на первый элемент numbers.emplace(iter + 2, 8); // добавляем после второго элемента numbers = < 1, 2, 8, 3, 4, 5>;
std::vector numbers1< 1, 2, 3, 4, 5 >; auto iter1 = numbers1.cbegin(); // константный итератор указывает на первый элемент numbers1.insert(iter1 + 2, 8); // добавляем после второго элемента //numbers1 = < 1, 2, 8, 3, 4, 5>; std::vector numbers2 < 1, 2, 3, 4, 5 >; auto iter2 = numbers2.cbegin(); // константный итератор указывает на первый элемент numbers2.insert(iter2 + 1, 3, 4); // добавляем после первого элемента три четверки //numbers2 = < 1, 4, 4, 4, 2, 3, 4, 5>; std::vector values < 10, 20, 30, 40, 50 >; std::vector numbers3 < 1, 2, 3, 4, 5 >; auto iter3 = numbers3.cbegin(); // константный итератор указывает на первый элемент // добавляем после первого элемента три первых элемента из вектора values numbers3.insert(iter3 + 1, values.begin(), values.begin() + 3); //numbers3 = < 1, 10, 20, 30, 2, 3, 4, 5>; std::vector numbers4 < 1, 2, 3, 4, 5 >; auto iter4 = numbers4.cend(); // константный итератор указывает на позицию за последним элементом // добавляем в конец вектора numbers4 элементы из списка < 21, 22, 23 >numbers4.insert(iter4, < 21, 22, 23 >); //numbers4 = < 1, 2, 3, 4, 5, 21, 22, 23>;

Удаление элементов

Если необходимо удалить все элементы вектора, то можно использовать функцию clear :

std::vector v < 1,2,3,4 >; v.clear();

Функция pop_back() удаляет последний элемент вектора:

std::vector v < 1,2,3,4 >; v.pop_back(); // v =

Если нужно удалить элемент из середины или начала контейнера, применяется функция std::erase() , которая имеет следующие формы:

  • erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
  • erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент

std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; auto iter = numbers1.cbegin(); // указатель на первый элемент numbers1.erase(iter + 2); // удаляем третий элемент // numbers1 = < 1, 2, 4, 5, 6 >std::vector numbers2 = < 1, 2, 3, 4, 5, 6 >; auto begin = numbers2.cbegin(); // указатель на первый элемент auto end = numbers2.cend(); // указатель на последний элемент numbers2.erase(begin + 2, end — 1); // удаляем с третьего элемента до последнего // numbers2 =

Также начиная со стандарта С++20 в язык была добавлена функция std::erase() . Она не является частью типа vector. В качестве первого параметра она принимает вектор, а в качестве второго — элемент, который надо удалить:

std::vector numbers3 < 1, 2, 3, 1, 5, 6 >; std::erase(numbers3, 1); // numbers3 =

В данном случае удаляем из вектора numbers3 все вхождения числа 1.

Размер вектора

С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:

#include #include int main() < std::vectornumbers; if(numbers.empty()) std::cout

С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:

  • resize(n) : оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
  • resize(n, value) : также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value

std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; numbers1.resize(4); // оставляем первые четыре элемента — numbers1 = numbers1.resize(6, 8); // numbers1 =

Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.

Изменение элементов вектора

Функция assign() позволяет заменить все элементы вектора определенным набором:

std::vector langs = < "Java", "JavaScript", "C">; langs.assign(4, «C++»); // langs =

В данном случае элементы вектора заменяются набором из четырех строк «C++».

Также можно передать непосредственно набор значений, который заменит значения вектора:

std::vector langs< "Java", "JavaScript", "C">; langs.assign(< "C++", "C#", "C">); // langs =

Еще одна функция — swap() обменивает значения двух контейнеров:

std::vector clangs < "C++", "C#", "Java" >; std::vector ilangs < "JavaScript", "Python", "PHP">; clangs.swap(ilangs); // clangs = < "JavaScript", "Python", "PHP">; for(std::string lang : clangs)

Сравнение векторов

Векторы можно сравнивать — они поддерживают все операции сравнения: , =, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:

std::vector v1 ; std::vector v2 ; std::vector v3 ; bool v1v2 = v1 == v2; // true bool v1v3 = v1 != v3; // true bool v2v3 = v2 == v3; // false

Vector C++

Размер указывать заранее не нужно. Память будет выделяться по мере необходимости, иначе говоря, динамически.

К каждому элементу вектора легко получить доступ зная его порядковый номер.

Теорию можно изучить, например, в Википедии

Пример

1. vector vec0 size is 0 vector vec0 is empty

2. vector vec size is 5 vector vec is not empty

После запуска программы результат будет таким:

1. vector vec0 size is 0 vector vec0 is empty 2. vector vec size is 5 vector vec is not empty 3. 4 4 4 4 4 4. 4 4 4 4 4 5. new elements are added with push_back 6. 4 4 4 4 4 7 8 9 8. 4 4 4 4 4 7 9. vec_two size is 6 10. 4 4 4 4 4 7 11. identical C:\Users\ao\source\repos\vectors1.exe (process 111800) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .

Задача

Создать вектор целых чисел vi от 0 до 9 и вывести на экран.

Вывести на экран размер вектора vi.

#include #include #include using namespace std; int main() < vectorvi; for ( int i = 0; i < 10; i++) < vi.push_back(i); >for ( auto item : vi) < cout cout

0 1 2 3 4 5 6 7 8 9 int vector vi has 10 elements. C:\Users\ao\source\repos\vector_00.exe (process 101408) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .

Вручную меняем значения нескольких элементов

vi[5] = 3; vi[6] = -1; vi[1] = 99;

Выведем изменённый вектор на экран другим способом:

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 C:\Users\ao\source\repos\vector_00.exe (process 101408) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .

Вычислим сколько элементов вектора равны 3. Для вывода вектора на экран воспользуемся новым способом.

#include #include #include #include // for sort and count using namespace std; int main() < vectorvi; for ( int i = 0; i < 10; i++) < vi.push_back(i); >vi[5] = 3; vi[6] = -1; vi[1] = 99; for ( auto i = begin(vi); i != end(vi); i++) < cout cout

0 99 2 3 4 3 -1 7 8 9 vector of ints has 2 elements with value 3 C:\Users\ao\source\repos\vector_00.exe (process 4108) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .

Задача

Записать три слова, введённые с клавиатуры в вектор, вывести их на экран, отсортировать по алфавиту, определить сколько в первом слове букв о.

enter three words heihei andreyolegovich topbicycle heihei andreyolegovich topbicycle andreyolegovich heihei topbicycle first word has 2 letter o’s C:\Users\wd973579\source\repos\Plural_02\Debug\Plural_02.exe (process 93128) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .

Как Вы можете увидеть слова отсортированы по алфавиту. В названии сайта andreyolegovich две буквы о.

Вывести по отдельности элементы

Задача: дана строка с числами через запятую.

Нужно:
вывести числа на экран по отдельности.
вычислить сумму чисел

После запуска программы результат будет таким:

12 1 214 3234 12 1 214 3234 Сумма чисел в строке = 3461 C:\Users\ao\source\repos\vector_01.exe (process 144128) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .

Создать двухмерный Vector C++

Задача: создать двухмерный вектор 3 на 5 и заполнить его случайными числами от 0 до 9

После запуска программы результат будет таким:

1 7 4 0 9 4 8 8 2 4 5 5 1 7 1 C:\Users\ao\source\repos\vector_02.exe (process 145912) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .

Изображение баннера

Видео

В видео ниже есть всё, что описано в статье кроме более быстрого перебора элеметов вектора.

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *