Всем привет! До этого дня мы использовали чистые массивы. Чистые — это значит простые массивы, не имеющие у себя в багаже различных функций. В этом уроке мы пройдем нечистые массивы — векторы.
Быстрый переход по статье:
- Что такое вектор (vector)
- Как создать вектор (vector) в C++
- Второй способ обратиться к ячейке
- Как указать количество ячеек для вектора
- Как сравнить два вектора
- Итерация через вектор C++ с использованием цикла » for
- 7 ответов
- переключение контейнеров позже не аннулирует ваш код.
- время выполнения ловли недопустимой итерации
- Двумерный вектор в C++
- Пример 1. Создайте двумерный вектор из равного количества столбцов
- Пример 2: Создайте двумерный вектор с другим количеством столбцов
- Пример 3: Инициализировать двумерный пустой вектор со значением по умолчанию
- Пример 4: Инициализировать двумерный пустой вектор, принимая входные значения
- Заключение
- 🎦 Видео
Видео:vector | Библиотека стандартных шаблонов (stl) | Уроки | C++ | #1Скачать
Что такое вектор (vector)
Вектор — это структура данных, которая уже является моделью динамического массива.
Давайте вспомним о том, что для создания динамического массива (вручную) нам нужно пользоваться конструктором new и вдобавок указателями. Но в случае с векторами всего этого делать не нужно.
Вообще, по стандарту пользоваться динамическим массивом через конструктор new — не есть правильно. Так как в компьютере могут происходить различные утечки памяти.
Видео:Двумерные массивы вывод. Заполнение. Двумерный массив циклы. C++ для начинающих. #32Скачать
Как создать вектор (vector) в C++
Сначала для создания вектора нам понадобится подключить библиотеку — , в ней хранится шаблон вектора.
Кстати, сейчас и в будущем мы будем использовать именно шаблон вектора. Например, очередь или стек, не созданные с помощью массива или вектора, тоже являются шаблонными.
Далее, чтобы объявить вектор, нужно пользоваться конструкцией ниже:
- Вначале пишем слово vector .
- Далее в угольных скобках указываем тип, которым будем заполнять ячейки.
- И в самом конце указываем имя вектора.
В примере выше мы создали вектор строк.
Кстати, заполнить вектор можно еще при инициализации (другие способы мы пройдем позже — в методах вектора). Делается это также просто, как и в массивах. Вот так:
После имени вектора ставим знак равенства и скобки, в которых через пробел указываем значение элементов.
Такой способ инициализации можно использовать только в C++!
Так, чтобы заполнить вектор строками, нам нужно использовать кавычки — «строка» .
Второй способ обратиться к ячейке
Мы знаем, что в векторе для обращения к ячейке используются индексы. Обычно мы их используем совместно с квадратными скобками [] .
Но в C++ есть еще один способ это сделать благодаря функции — at(). В скобках мы должны указать индекс той ячейки, к которой нужно обратиться.
Вот как она работает на практике:
Давайте запустим эту программу:
Как указать количество ячеек для вектора
Указывать размер вектора можно по-разному. Можно это сделать еще при его инициализации, а можно хоть в самом конце программы. Вот, например, способ указать длину вектора на старте:
Так в круглых скобках () после имени вектора указываем первоначальную длину. А вот второй способ:
Первая строчка нам уже знакома. А вот во второй присутствует незнакомое слово — reserve , это функция, с помощью которой мы говорим компилятору, какое количество ячеек нам нужно использовать.
Вы можете задать логичный вопрос:»А в чем разница?». Давайте создадим два вектора и по-разному укажем их количество ячеек.
Как видим, в первом случае мы вывели три нуля, а во втором: 17, 0, 0.
Все потому, что при использовании первого способа все ячейки автоматически заполнились нулями.
При объявлении чего-либо (массива, вектора, переменной и т.д) мы выделяем определенное количество ячеек памяти, в которых уже хранится ненужный для ПК мусор. В нашем случае этим мусором являются числа.
Поэтому, когда мы вывели второй вектор, в нем уже находились какие-то рандомные числа — 17, 0, 0. Обычно они намного больше. Можете кстати попробовать создать переменную и вывести ее значение.
Нужно помнить! При использовании второго способа есть некоторый плюс — по времени. Так как для первого способа компилятор тратит время, чтобы заполнить все ячейки нулями.
Видео:array и vector в языке программирования с++Скачать
Как сравнить два вектора
Если в середине программы нам понадобиться сравнить два массива, мы, конечно, используем цикл for и поочередно проверим все элементы.
Вектор снова на шаг впереди! Чтобы нам сравнить два вектора, потребуется применить всего лишь оператор ветвления if.
Видео:Программирование на С++. Урок 70. ВекторСкачать
Итерация через вектор C++ с использованием цикла » for
Я новичок в языке C++. Я начал использовать векторы и заметил, что во всем коде я вижу итерацию, хотя вектор через индексы, первый параметр for цикл всегда основан на векторе. В Java я мог бы сделать что-то подобное с ArrayList:
почему я не вижу этого в C++? Это плохая практика?
Видео:Вывод массива. Массивы и циклы. Цикл с массивом. Array c++. C++ для начинающих. Урок #27.Скачать
7 ответов
есть ли причина, по которой я не вижу этого в C++? Это плохая практика?
нет. Это не плохая практика, но она делает ваш код определенным гибкость.
обычно, pre-c++11 код для итерации по элементам контейнера использует итераторы, что-то вроде:
Это потому что это делает код более гибким.
все стандартные контейнеры библиотеки поддерживают и обеспечивают итераторы и учитывая, что если на более поздней стадии разработки вам нужно переключить другой контейнер, этот код не нужно менять.
Примечание: написание кода, который работает с каждым возможным стандартным контейнером библиотеки, не так легко, как может показаться.
iterator код стиля.
следующие могут быть причинами людей, не рассматривающих vector.size() способ зацикливания:
- быть параноиком о вызове size() каждый раз в цикле состояние. Однако либо это не проблема, либо это может быть тривиально исправлено
- предпочитая std::for_each() на for цикл
- позже изменение контейнера из std::vector к другому (например map , list ) также потребует изменения механизма зацикливания, потому что не каждый контейнер поддерживает size() стиль перекручивание
C++11 обеспечивает хорошее средство для перемещения через контейнеры. Это называется «range based for loop» (или «enhanced for loop» в Java).
С небольшим кодом вы можете пройти через полный (в обязательном порядке!) std::vector :
самый чистый способ итерации через вектор — через итераторы:
или (эквивалент выше)
до C++0x вы должны заменить auto типом итератора и использовать функции-члены вместо глобальных функций begin и end.
это, вероятно, то, что вы видели. По сравнению с подходом, который вы упомянули, преимущество заключается в том, что вы не сильно зависите от типа vector . Если вы измените vector в другой класс «collection-type», ваш код, вероятно, все еще будет работать. Однако вы можете сделать что-то подобное и на Java. Концептуально разница невелика; C++, однако, использует шаблоны для реализации этого (по сравнению с дженериками в Java); следовательно, подход будет работать для всех типов, для которых begin и end функции определены, даже для неклассовых типов, таких как статические массивы. Смотрите здесь: как работает диапазон для простых массивов?
правильный способ сделать это:
где T-тип класса внутри вектора. Например, если класс был CActivity, просто напишите CActivity вместо T.
этот тип метода будет работать на каждом STL (а не только векторах, что немного лучше).
Если вы все еще хотите использовать указатели, как это:
есть несколько веских причин использовать итераторы, некоторые из которых упоминаются здесь:
Видео:Программирование на С++. Урок 71. Пример работы с вектором. Двумерный вектор.Скачать
переключение контейнеров позже не аннулирует ваш код.
т. е., если вы переходите от std:: vector к std::list или std:: set, вы не можете использовать числовые индексы, чтобы получить содержащееся значение. Использование итератора по-прежнему допустимо.
Видео:ЯЗЫК C++ #19 — ВЕКТОРСкачать
время выполнения ловли недопустимой итерации
Если вы измените свой контейнер в середине цикла, в следующий раз вы используйте свой итератор, он выдаст недопустимое исключение итератора.
С STL программисты используют iterators для обхода контейнеров, так как итератор является абстрактной концепцией, реализованной во всех стандартных контейнерах. Например, std::list нет operator [] на всех.
Я был удивлен, что никто не упомянул, что итерация через массив с целочисленным индексом позволяет вам легко писать ошибочный код, подписывая массив с неправильным индексом. Например, если у вас есть вложенные циклы, используя i и j как индексы, вас могут неправильно индекс массива с j , а не i и таким образом ввести ошибки в программе.
напротив, другие формы, перечисленные здесь, а именно диапазон на основе for петли и итераторы, намного меньше подвержены ошибкам. Семантика языка и механизм проверки типа компилятора предотвратят случайный доступ к массиву с использованием неправильного индекса.
Видео:Базовый курс С++ Часть #81. Вектор std::vectorСкачать
Двумерный вектор в C++
Вектор используется для создания динамического массива, и размер вектора можно увеличивать и уменьшать, добавляя и удаляя элементы из вектора. Когда вектор объявляется внутри другого вектора, этот вектор называется 2-мерным вектором, который работает как 2-мерный массив. Двумерный вектор содержит несколько строк, каждая из которых является другим вектором. В этом руководстве показано использование двумерного вектора в C ++.
Синтаксис:
Синтаксис двумерного вектора приведен ниже.
Конкретный тип данных определяется во время объявления вектора. Если размер вектора не определен, вектор называется пустым вектором. Размер вектора можно изменить, используя различные методы или инициализируя вектор.
Видео:Передача массива в функцию. Как передать массив в функцию. C++ для начинающих. Урок #35.Скачать
Пример 1. Создайте двумерный вектор из равного количества столбцов
В следующем примере показан способ объявления двухмерного вектора из трех строк и четырех столбцов, который содержит символьные данные. Здесь значения вектора были определены в момент вектор декларации и вложенную » для » петли используется для печати значения вектора.
using namespace std ;
int main ( )
<
/*
Declare a two-dimensional vector
of characters
*/
vector vector > chrVector
< , , > ;
//Print the values of the vector
cout «The values of the vector are: n « ;
for ( int i = ; i chrVector. size ( ) ; i ++ )
<
for ( int j = ; j chrVector [ i ] . size ( ) ; j ++ )
cout chrVector [ i ] [ j ] » « ;
cout ‘ n ‘ ;
>
return ;
>
Следующий вывод появится после выполнения вышеуказанного кода.
Видео:Математика это не ИсламСкачать
Пример 2: Создайте двумерный вектор с другим количеством столбцов
В следующем примере показан способ объявления двухмерного вектора из четырех строк, где первая строка содержит один столбец, вторая строка содержит два столбца, третья строка содержит три столбца, а четвертая строка содержит четыре столбца. Вектор инициализации с целым данных и распечатаны с помощью вложенной « для » петли.
using namespace std ;
int main ( )
<
/*
Initialize the 2D vector with the
integer number where each row contains different
number of elements
*/
vector vector > intVector
< , , , > ;
//Print the values of the vector using for loop
cout «The values of the vector are: n « ;
for ( vectorrow : intVector )
<
for ( int val : row )
cout val » « ;
cout ‘ n ‘ ;
>
return ;
>
Следующий вывод появится после выполнения вышеуказанного кода.
Видео:#7. Реализация динамического массива на С++ с помощью std::vector | Структуры данныхСкачать
Пример 3: Инициализировать двумерный пустой вектор со значением по умолчанию
Способ объявления 2-мерного пустого вектора числа с плавающей запятой и инициализации вектора с числом с плавающей запятой показан в следующем примере. Здесь вложенный цикл for был использован для вставки данных в вектор с помощью функции push_back () и печати значений вектора.
Значение по умолчанию 6.5 было вставлено в вектор путем создания 2 строк и 3 столбцов. Функция size () использовалась для подсчета общего количества строк и столбцов для печати значений вектора.
using namespace std ;
int main ( )
<
//Set the default value
float default_value = 6.5 ;
//Define the outer vector
vector vector > outVect ;
for ( int i = ; i 2 ; i ++ )
<
//Define the inner vector
vectorinVect ;
for ( int j = ; j 3 ; j ++ ) <
//Insert the default value
inVect. push_back ( default_value ) ;
>
//Insert the inner vector to outer vector
outVect. push_back ( inVect ) ;
>
//Print the values of the vector
cout «The values of the vector are: n « ;
for ( int i = ; i outVect. size ( ) ; i ++ )
<
for ( int j = ; j outVect [ i ] . size ( ) ; j ++ )
cout outVect [ i ] [ j ] » « ;
cout ‘ n ‘ ;
>
return ;
>
Следующий вывод появится после выполнения вышеуказанного кода. Выходные данные показывают содержимое вектора на основе значения по умолчанию и количества строк и столбцов, созданных кодом.
Видео:C++ 22. Внутреннее устройство vectorСкачать
Пример 4: Инициализировать двумерный пустой вектор, принимая входные значения
В следующем примере показан способ создания двухмерного вектора, получая данные от пользователя. В коде объявлен двумерный пустой вектор целого числа, который будет содержать 2 строки и 3 столбца.
Вложенная » для » петли используется, чтобы принять 6 (2 × 3) целые числа от пользователя и вставить их в вектор с использованием значений индекса. Еще одна вложенная » для » петли была использовано для печати вставленных значений вектора.
using namespace std ;
int main ( )
<
//Define the number of cols
int col = 3 ;
//Define the number of rows
int row = 2 ;
//Initialize an integer variable
int val = ;
//Initialize the empty vector
vector vector > int2DVector ;
//Resize the outer vector
int2DVector. resize ( row ) ;
for ( int i = ; i row ; i ++ )
<
//Resize the inner vector
int2DVector [ i ] . resize ( col ) ;
for ( int j = ; j col ; j ++ )
<
//Take input from the user
cout val ;
//Insert into the vector
int2DVector [ i ] [ j ] = val ;
>
>
//Print the values of the vector
cout «The values of the vector are: n « ;
for ( int i = ; i int2DVector. size ( ) ; i ++ )
<
for ( int j = ; j int2DVector [ i ] . size ( ) ; j ++ )
cout int2DVector [ i ] [ j ] » « ;
cout ‘ n ‘ ;
>
return ;
>
Следующий вывод появится после выполнения вышеуказанного кода. Выходные данные показывают 6 входных значений и содержимое вектора в зависимости от количества строк и столбцов.
Видео:Vector In C++Скачать
Заключение
Двумерный вектор используется в программировании на C ++ для хранения и доступа к данным на основе строк и столбцов. В этом уроке на простых примерах были показаны различные способы создания двумерного вектора. Цель использования двумерного вектора в C ++ будет понятна после прочтения этого руководства.
🎦 Видео
Кормлю белок. Зарисовка / I feed the squirrels. SketchСкачать
🔥 БЕСПЛАТНЫЙ БАЗОВЫЙ КУРС ПО GPTs ВСЕ НЮАНСЫ РАЗОМСкачать
МНЕ НЕ ПОНЯТНО! КАК НАДО ДЕЛАТЬ ОТОПЛЕНИЕ С ПРИМЕНЕНИЕМ ТВЕРДОТОПЛИВНОГО КОТЛА?Скачать
Динамический массив с++ пример. Создание, заполнение, удаление, размер динамического массива. #55Скачать
Двумерный динамический массив c++ пример. Создание, заполнение, удаление. Динамические массивы. #56Скачать
04.1 Массивы и векторы в C++ на примерах задачСкачать
Массив объектов класса. Динамический. Статический. Создание Особенности. ООП C++ Для начинающих #96Скачать