Как вывести вектор c
Перейти к содержимому

Как вывести вектор c

Вывести элементы вектора через запятую в C++

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

1. C++ 17 — Использование std::experimental::ostream_joiner

std :: vector < int >nums = < 1 , 2 , 3 , 4 , 5 >;
std :: copy ( nums . begin ( ) ,
std :: experimental :: make_ostream_joiner ( std :: cout , «, » ) ) ;

результат:

1, 2, 3, 4, 5

2. Использование цикла for

Другое решение — использовать простой цикл for с явной проверкой, печатать разделитель перед элементом или нет.

std :: vector < int >nums = < 1 , 2 , 3 , 4 , 5 >;
for ( int i = 0 ; i < nums . size ( ) ; i ++ ) < std :: cout << nums [ i ] ;

результат:

1, 2, 3, 4, 5

3. Использование цикла for на основе диапазона

В качестве альтернативы вы можете использовать цикл for на основе диапазона и печатать разделитель перед всеми элементами (кроме начала диапазона).

std :: vector < int >nums = < 1 , 2 , 3 , 4 , 5 >;
for ( auto it = nums . begin ( ) ; it != nums . end ( ) ; it ++ ) < if ( it != nums . begin ( ) ) < std :: cout << * it ;

результат:

1, 2, 3, 4, 5

4. Использование std::ostream_iterator

Вы можете избежать циклов for и скопировать содержимое вектора непосредственно в выходной поток, используя выходной итератор. std::ostream_iterator .

std :: vector < int >nums = < 1 , 2 , 3 , 4 , 5 >;
std :: copy ( nums . begin ( ) , nums . end ( ) , std :: ostream_iterator < int >( std :: cout , «, » ) ) ;

результат:

1, 2, 3, 4, 5,

Код можно легко изменить, чтобы не печатать лишнюю запятую.

std :: vector < int >nums = < 1 , 2 , 3 , 4 , 5 >;
std :: copy ( nums . begin ( ) , std :: prev ( nums . end ( ) ) ,
std :: ostream_iterator < int >( std :: cout , «, » ) ) ;
// печатаем последний элемент
if ( ! nums . empty ( ) ) < std :: cout << nums . back ( ) ;

результат:

1, 2, 3, 4, 5

5. C++20 — Использование цикла foreach

Начиная с C++20, вы можете использовать цикл foreach с оператором init для обработки особого случая для первой итерации, как показано ниже:

std :: vector < int >nums = < 1 , 2 , 3 , 4 , 5 >;
for ( bool isFirst < true >; int &i : nums ) < std :: cout << ( isFirst ? isFirst = false , "" : ", " ) << i ;

результат:

1, 2, 3, 4, 5

Это все о печати элементов вектора, разделенных запятой в C++.

Оценить этот пост

Средний рейтинг 5 /5. Подсчет голосов: 12

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂

Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации

  • Все проблемы
  • Практика DSA
  • 100 самых популярных задач
  • 50 лучших классических задач
  • Лучшие алгоритмы
  • Компилятор С/С++
  • Компилятор Java
  • Компилятор Python
  • Компилятор JavaScript
  • компилятор PHP
  • Компилятор C#
  • Свяжитесь с нами
  • Политика конфиденциальности
  • условия обслуживания
  • Подпишитесь на новые публикации

Techie Delight © 2023 Все права защищены.

Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно

Введение в вектора в C++

Если до сих пор вы пользовались «чистыми» массивами в языке С++, вы многое потеряли. Под «чистыми» массивами я подразумеваю обычное использование массивов в С++, без специальных функций и методов. Прочитав эту статью, вы узнаете как можно работать с массивами на более высоком уровне, вы сможете обрабатывать массивы (объявление, инициализация, поиск, сортировка и многие другие операции) буквально несколькими строчками.
Итак, что же такое «Вектор» в языке С++? Простыми словами вектор можно описать как абстрактную модель, которая имитирует динамический массив. Пока не стоит углубляться в это определение, сейчас мы приступим к практике и вам все станет понятно.
Если мы хотим использовать векторы в своей программе, необходимо подключить заголовочный файл :

#include

Вектор можно объявить следующим образом:

std::vector myVector; // мы создали пустой вектор типа int myVector.reserve(10); // тут мы зарезервировали память под 10 элементов типа int

Как видно из примера, вектора относятся к пространству имен std . По сути, эти две записи эквивалентны такой записи:

int myVector[10]; // обычное объявление массива

На первый взгляд, объявление вектора оказалось намного более громоздкое. Однако вектора скрывают очень мощный функционал, чего нельзя сказать об обычных массивах С++. Кроме того, вектор можно объявить и в одной строке, вот так:

std::vector myVector(10);

Эта запись эквивалентна двум предыдущим, то есть здесь мы объявили вектор с начальным размером в 10 элементов типа int . Но кроме этого, такой способ объявления вектора не просто выделяет память, но и еще инициализирует все элементы вектора нулями. Вот пример:

#include #include // подключаем модель Векторов using namespace std; int main() < vectormyVector(10); // объявляем вектор размером в 10 элементов и инициализируем их нулями // вывод элементов вектора на экран for(int i = 0; i

Обратите внимание на то, что размер вектора определяется методом size() , это очень удобно, если мы не знаем размер массива. Вывод:

CppStudio.com

0 0 0 0 0 0 0 0 0 0

Если объявить вектор таким образом:

vector myVector; // объявляем пустой вектор myVector.reserve(10); // выделяем память под 10 элементов

то результат работы программы будет другим, в потоке вывода ничего не появится, так как нет начальной инициализации элементов вектора, а значит этот способ объявления вектора выполнится быстрее. Именно в этом и заключается разница этих способов объявления векторов.
Несколькими абзацами выше, я упомянул о начальном размере вектора. Почему же начальный размер? Потому, что, если размера вектора будет не хватать, вектор автоматически будет увеличиваться, при добавлении новых элементов, пересчитывая свой размер. Это очень удобно, так как за частую мы не можем предугадать размер массива, который нам нужен для работы программы. Более подробно мы рассмотрим этот пример немного позже.
Смотрите как легко можно скопировать вектор:

#include #include // подключаем модель Векторов using namespace std; int main() < vectormyVector1(10); // вывод элементов вектора на экран cout cout << "\nСкопированный массив: "; vectormyVector2(myVector1); // при объявлении второго вектора, копируется - первый for(int i = 0; i < myVector2.size(); i++) < myVector2[i] = i; cout return 0; >

CppStudio.com

Входной массив: 0 1 2 3 4 5 6 7 8 9 Скопированный массив: 0 1 2 3 4 5 6 7 8 9

Из результат работы программы хорошо видно ,что в строке 14, была создана копия вектора myVector1 . Рассмотрим программу, в которой сравниваются два массива:

#include #include using namespace std; int main() < vectorarray1(3); // инициализируем элементы вектора array1 array1[0] = 4; array1[1] = 2; array1[2] = 1; vector array2(3); // инициализируем элементы вектора array2 array2[0] = 4; array2[1] = 2; array2[2] = 1; // сравниваем массивы if (array1 == array2) < cout return 0; >

CppStudio.com

array1 == array2

Итак, массивы мы инициализировали обыкновенным для нас способом, строки 8-10 и 13-15. Самое удивительное то, что операция сравнивания векторов выполняется в одну строку, строка 17. Попробуйте сделать то же самое с обычными массивами в С++, уверен, что у вас ничего не получится.
До этого, во всех примерах в этой статье я выводил элементы массива используя цикл, с векторами можно обойтись и без него. Смотрим как именно это делается.

#include #include #include // заголовочный файл итераторов using namespace std; int main() < vectorarray1; // создаем пустой вектор // добавляем в конец вектора array1 элементы 4, 3, 1 array1.insert(array1.end(), 4); array1.insert(array1.end(), 3); array1.insert(array1.end(), 1); // вывод на экран элементов вектора copy( array1.begin(), // итератор начала массива array1.end(), // итератор конца массива ostream_iterator(cout," ") //итератор потока вывода ); return 0; >

CppStudio.com

4 3 1

Итак, начнем по порядку. В строке 3 я добавил новый заголовочный файл, для использования итераторов. Так как в строке 8 мы создали пустой вектор, то конец вектора — это его начало, ведь в векторе нет никаких элементов. Так что, когда мы добавляем новые элементы в массив, мы должны использовать итератор array1.end() , а не итератор array1.begin() . Иначе порядок элементов в массиве станет противоположным. В строках 10-12 мы используем метод insert(), который позволяет вставить элемент в массив. Ну и самое главное, вывод элементов массива выполняется не через цикл а через операцию copy() . В первых двух параметрах мы указали итераторы начала и конца вектора. В третьем параметре указан поток вывода cout — ostream_iterator(cout,» «) . Как по мне, такой способ организации вывода на экран намного красивее выглядит, хотя, возможно сразу и не понятен для новичка. Но вы просто постарайтесь его принять как должное и запомнить.

Как в С++ красиво вывести элементы vector в консоль / просто в поток?

Банальная задача, миллион раз реализованная, но всегда, на мой взгляд, как-то не очень красиво.
Есть некий контейнер, пара итераторов, просто массив или что-то еще подобное.
Надо вывести значения куда-то через разделитель , да так чтобы он был только между значениями.
Есть всякие варианты — с проверкой на то первый ли это элемент, или последний элемент. Даже такой экзотический видел, с забоем последней запятой:

template void print(const container& c) < std::cout (std::cout, ", ")); std::cout

Наверное самым приемлемым будет, такое

if (c.size() > 0 ) std::cout 

Но вдруг кто-то что-то подскажет из своего опыта

  • Вопрос задан более трёх лет назад
  • 1748 просмотров

Как вывести вектор 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

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

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