В этом посте представлен обзор доступных альтернатив для построения вектора векторов в C++.
В C++ мы можем определить вектор векторов целых чисел следующим образом:
Приведенное выше определение приводит к пустому двумерному вектору. Чтобы использовать его, мы должны определить размер вектора и выделить память для его элементов. Существует несколько методов выращивания двумерного вектора с помощью resize()
или же push_back()
функций или с помощью конструктора заполнения или списков инициализаторов. Теперь давайте подробно рассмотрим каждую альтернативу:
1. Использование resize()
функция
The resize()
Функция используется для изменения размера вектора до указанного размера. Мы можем использовать его для инициализации вектора векторов, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <vector> using namespace std; #define R 4 #define C 5 int main() { // создать vector объектов `R` типа vector<int> // и изменить размер каждого объекта до размера `C` vector<vector<int>> mat(R); for (int i = 0 ; i < R ; i++) { mat[i].resize(C); } // печатаем вектор return 0; } |
Скачать Выполнить код
Мы можем представить вектор векторов как двумерный массив, состоящий из R строк и C столбцов. Вот альтернативная версия приведенного выше кода, в которой используется перегруженная версия resize()
функция, которая принимает размер контейнера и объект, который нужно скопировать в этот контейнер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <vector> using namespace std; #define R 4 #define C 5 int main() { // создание экземпляра векторного объекта типа vector<int> vector<vector<int>> mat; // изменить размер вектора на `R` элементов типа vector<int>, каждый из которых имеет размер `C` mat.resize(R, std::vector<int>(C)); // печатаем вектор return 0; } |
Скачать Выполнить код
2. Использование push_back()
функция
Другой вероятный способ инициализации вектора векторов состоит в использовании push_back()
функция, которая добавляет заданный элемент в конец вектора. Следующая программа на C++ демонстрирует это:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <vector> using namespace std; #define R 4 #define C 5 int main() { // создание экземпляра векторного объекта типа vector<int> а также // используем функцию `push_back()` для изменения размера vector<vector<int>> mat; for (int i = 0; i < R; i++) { // построить vector из int vector<int> v; for (int j = 0; j < C; j++) { v.push_back(0); } // отодвигаем назад над одномерным вектором mat.push_back(v); } // печатаем вектор return 0; } |
Скачать Выполнить код
Обратите внимание, когда размеры R
а также C
велики, приведенный выше код страдает от потенциального снижения производительности, вызванного частым перераспределением памяти push_back()
функция. Это следует использовать только в том случае, если размеры вектора заранее неизвестны.
3. Использование конструктора заливки
Рекомендуемый подход использует конструктор заполнения векторного контейнера для построения вектора векторов. Конструктор заполнения принимает начальный размер n
и значение и создает вектор n
элементов и заполняет указанным значением по умолчанию.
#include <iostream> #include <vector> using namespace std; #define R 4 #define C 5 int main() { // Использование конструктора заполнения для построения вектора векторов vector<vector<int>> mat(R, vector<int>(C)); // печатаем вектор return 0; } |
Скачать Выполнить код
Мы можем разделить описанную выше инициализацию на две части — сначала инициализировать vector целых чисел, а затем использовать его для инициализации вектора векторов с помощью конструктора заполнения. Это показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <vector> using namespace std; #define R 4 #define C 5 int main() { // сначала инициализируем vector целых чисел vector<int> v(C); // Используйте приведенный выше vector для инициализации вектора векторов // использование конструктора заполнения vector<vector<int>> mat(R, v); // печатаем вектор return 0; } |
Скачать Выполнить код
4. Использование списка инициализаторов
Наконец, мы можем использовать списки инициализаторов, представленные в C++11, для построения вектора векторов, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <vector> using namespace std; int main() { // использование списка инициализаторов для построения вектора векторов vector<vector<int>> mat { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }; // печатаем вектор return 0; } |
Скачать Выполнить код
Как напечатать вектор векторов?
Следующая процедура будет отображать вектор векторов целого числа, используя вложенные циклы:
template<class T> void printVector(vector<vector<T>> const &mat) { for (vector<T> row: mat) { for (T val: row) { cout << val << » «; } cout << endl; } } |
Это все о построении вектора векторов в C++.
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
На чтение 6 мин Просмотров 4.9к. Опубликовано 05.08.2021
Вектор — очень полезный класс C ++ для создания динамического массива. Размер вектора можно изменить в любой момент для решения любой проблемы программирования. В C ++ существует множество встроенных функций для выполнения различных типов задач в векторном контейнере. Функция resize () — одна из них. Используется для изменения размера вектора. Размер вектора можно увеличить или уменьшить с помощью этой функции. В этом руководстве было объяснено использование функции resize () в векторе C ++.
Синтаксис:
Функцию resize () можно использовать по-разному. Ниже приведены два синтаксиса этой функции.
void resize (size_type n)
Если значение n меньше исходного размера векторного объекта, то размер вектора будет уменьшен. Если значение n больше исходного размера вектора, то размер вектора будет увеличен. Если значение n равно исходному размеру вектора, то размер вектора останется неизменным.
void resize (size_type n, const value_type& value);
Если в этой функции используется второй аргумент, то значение аргумента будет добавлено в конец вектора.
Обе функции resize () ничего не возвращают.
Предварительные условия:
Прежде чем проверять примеры этого руководства, вы должны проверить, установлен ли компилятор g ++ в системе. Если вы используете Visual Studio Code, установите необходимые расширения для компиляции исходного кода C ++ и создания исполняемого кода. Здесь приложение Visual Studio Code было использовано для компиляции и выполнения кода C ++. Различные варианты использования этой функции показаны в следующей части этого руководства на различных примерах.
Содержание
- Пример 1: уменьшить размер вектора
- Пример 2: увеличить размер вектора
- Пример 3: Измените размер вектора со значениями
- Заключение
Пример 1: уменьшить размер вектора
Создайте файл C ++ со следующим кодом, чтобы проверить, как уменьшить размер вектора с помощью функции resize (). В коде объявлен вектор из 4 строковых значений. После печати исходного размера вектора в вектор были вставлены три новых значения. Размер вектора был снова напечатан после вставки. Функция resize () использовалась для уменьшения размера вектора до 5. Размер вектора был напечатан снова после уменьшения размера.
//Include necessary libraries
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//Declare a vector of string values
vector<string> foods = {«Cake», «Pastry», «Pizza», «Burger»};
cout << «The current size of the vector: « << foods.size() << endl;
//Add three elements
foods.push_back(«Pasta»);
foods.push_back(«French Fry»);
foods.push_back(«Chicken Fry»);
cout << «The current size of the vector after insertion: « << foods.size() << endl;
//Resize the vector
foods.resize(5);
cout << «The current size of the vector after resize: « << foods.size() << endl;
return ;
}
Выход:
Следующий вывод появится после выполнения вышеуказанного кода. Выходные данные показывают, что исходный размер вектора был 4, размер стал 7 после вставки 3 новых значений, а размер стал 5 после использования функции resize ().
Пример 2: увеличить размер вектора
Создайте файл C ++ со следующим кодом, чтобы проверить, как увеличить размер вектора с помощью функции resize (). В коде объявлен вектор из 5 целых чисел. Размер исходного вектора был напечатан до увеличения размера вектора с помощью функции resize (). Размер вектора был напечатан снова после изменения размера до 8. Затем 5 чисел были вставлены в конец вектора, и размер измененного вектора был напечатан снова.
//Include necessary libraries
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//Declare a vector of integer values
vector<int> numbers = {10, 90, 20, 80, 30 };
cout << «The current size of the vector: « << numbers.size() << endl;
//Resize the vector
numbers.resize(8);
cout << «The current size of the vector after resize: « << numbers.size() << endl;
//Add 5 numbers into the vector
numbers.push_back(60);
numbers.push_back(40);
numbers.push_back(50);
numbers.push_back(70);
numbers.push_back(100);
cout << «The current size of the vector after insertion: « << numbers.size() << endl;
return ;
}
Выход:
Следующий вывод появится после выполнения вышеуказанного кода. Выходные данные показывают, что исходный размер вектора был 5, размер стал 8 после изменения размера вектора, и размер стал 13 после вставки 5 элементов в вектор.
Пример 3: Измените размер вектора со значениями
Создайте файл C ++ со следующим кодом, чтобы проверить, как изменить размер вектора, вставив одно и то же значение несколько раз. В коде объявлен вектор из 5 чисел с плавающей запятой. Функция resize () использовалась для изменения размера вектора до 7 и вставки числа 5,55 в вектор два раза. Содержимое исходного вектора и измененного вектора будет напечатано после выполнения кода.
// resizing of the vector
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//Declare a vector of float values
vector<float> numbers = { 7.89, 3.98, 5.56, 9.65, 2.33 };
cout << «The values of the vector before resize:n«;
//Iterate the vector using loop to print the values
for(int i = ; i < numbers.size(); ++i)
cout << numbers[i] << » «;
cout << «n«;
//Resize the vector with values
numbers.resize(7, 5.55);
cout << «The values of the vector after resize:n«;
//Iterate the vector using loop to print the values
for(int i = ; i < numbers.size(); ++i)
cout << numbers[i] << » «;
cout << «n«;
return ;
}
Выход:
Следующий вывод появится после выполнения вышеуказанного кода. Выходные данные показывают, что число 5,55 было вставлено два раза в конец вектора.
Заключение
Использование функции resize () для изменения размера вектора со значением или без значения было описано в этом руководстве на простых примерах. Новый кодировщик C ++ сможет изменять размер вектора в зависимости от требований, используя функцию resize () после прочтения этого руководства.
Операции с векторами
Последнее обновление: 02.11.2017
Добавление элементов в вектор
Для добавления элементов в вектор применяется функция push_back(), в который передается добавляемый элемент:
#include <iostream> #include <vector> int main() { std::vector<int> numbers; // пустой вектор numbers.push_back(5); numbers.push_back(3); numbers.push_back(10); for(int n : numbers) cout << n << "t"; // 5 3 10 std::cout << std::endl; return 0; }
Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем
динамически добавлять в вектор новые данные.
Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:
std::vector<int> numbers1 = { 1, 2, 3, 4, 5 }; numbers1.emplace_back(8); // numbers1 = { 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
Функция emplace:
std::vector<int> numbers = { 1, 2, 3, 4, 5 }; auto iter = numbers.cbegin(); // константный итератор указывает на первый элемент numbers.emplace(iter + 2, 8); // добавляем после второго элемента numbers = { 1, 2, 8, 3, 4, 5};
Функция insert:
std::vector<int> numbers1 = { 1, 2, 3, 4, 5 }; auto iter1 = numbers1.cbegin(); // константный итератор указывает на первый элемент numbers1.insert(iter1 + 2, 8); // добавляем после второго элемента //numbers1 = { 1, 2, 8, 3, 4, 5}; std::vector<int> 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<int> values = { 10, 20, 30, 40, 50 }; std::vector<int> 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<int> 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<int> v = { 1,2,3,4 }; v.clear();
Функция pop_back() удаляет последний элемент вектора:
std::vector<int> v = { 1,2,3,4 }; v.pop_back(); // v = { 1,2,3 }
Если нужно удалить элемент из середины или начала контейнера, применяется функция erase(), которая имеет следующие формы:
-
erase(p): удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного,
или на конец контейнера, если удален последний элемент -
erase(begin, end): удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end.
Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент
Применение функции:
std::vector<int> numbers1 = { 1, 2, 3, 4, 5, 6 }; auto iter = numbers1.cbegin(); // указатель на первый элемент numbers1.erase(iter + 2); // удаляем третий элемент // numbers1 = { 1, 2, 4, 5, 6 } std::vector<int> numbers2 = { 1, 2, 3, 4, 5, 6 }; auto begin = numbers2.cbegin(); // указатель на первый элемент auto end = numbers2.cend(); // указатель на последний элемент numbers2.erase(begin + 2, end - 1); // удаляем с третьего элемента до последнего // numbers2 = {1, 2, 6}
Размер вектора
С помощью функции size() можно узнать размер вектора, а с помощью функции empty()
проверить, путой ли вектор:
#include <iostream> #include <vector> using std::vector; using std::cout; using std::endl; int main() { vector<int> numbers = {1, 2, 3}; if(numbers.empty()) cout << "Vector is empty" << endl; else cout << "Vector has size " << numbers.size() << endl; return 0; }
С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
-
resize(n): оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов.
Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию -
resize(n, value): также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются
недостающие элементы со значением value
Применение функции:
std::vector<int> numbers1 = { 1, 2, 3, 4, 5, 6 }; numbers1.resize(4); // оставляем первые четыре элемента - numbers1 = {1, 2, 3, 4} numbers1.resize(6, 8); // numbers1 = {1, 2, 3, 4, 8, 8}
Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.
Изменение элементов вектора
Функция assign() позволяет заменить все элементы вектора определенным набором:
std::vector<std::string> names = { "Tom", "Bob", "Kate"}; names.assign(4, "Sam"); // numbers = {"Sam", "Sam", "Sam", "Sam"}
В данном случае элементы вектора заменяются набором из четырех строк «Sam».
Еще одна функция — swap() обменивает значения двух контейнеров:
std::vector<std::string> clangs = { "C++", "C#", "Java" }; std::vector<std::string> ilangs = { "JavaScript", "Python", "PHP"}; clangs.swap(ilangs); // clangs = { "JavaScript", "Python", "PHP"}; for(std::string n : clangs) std::cout << n << "t"; std::cout << std::endl;
Сравнение векторов
Векторы можно сравнивать. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях.
Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:
std::vector<int> v1 = {1, 2, 3}; std::vector<int> v2 = {1, 2, 3}; std::vector<int> v3 = {3, 2, 1}; bool v1v2 = v1 == v2; // true bool v1v3 = v1 != v3; // true bool v2v3 = v2 == v3; // false
Ваю 27 / 27 / 9 Регистрация: 21.04.2015 Сообщений: 690 |
||||
1 |
||||
Как изменить размер двумерного вектора?13.01.2017, 19:22. Показов 8231. Ответов 9 Метки нет (Все метки)
Объявление у меня такое:
Изначально размер неизвестен, число строк и столбцов зависит от содержимого текстового фйла, по мере его обработки нужно изменять размеры на ходу.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
13.01.2017, 19:22 |
9 |
1623 / 953 / 782 Регистрация: 06.02.2016 Сообщений: 2,449 Записей в блоге: 30 |
|
13.01.2017, 19:22 |
2 |
Просто добавлять элементы
0 |
Ваю 27 / 27 / 9 Регистрация: 21.04.2015 Сообщений: 690 |
||||||||
13.01.2017, 19:43 [ТС] |
3 |
|||||||
Как добавлять? я умею только с одномерным работать не изменяя его размеров специально Можно ли так изменить число строк?
-//- столбцов?
0 |
Bretbas Каждому свое 532 / 218 / 81 Регистрация: 05.08.2013 Сообщений: 1,614 |
||||
13.01.2017, 19:52 |
4 |
|||
Е-мое, вот пример заполнение такого двумерного массива с клавиатуры
С файлами по аналогии
0 |
27 / 27 / 9 Регистрация: 21.04.2015 Сообщений: 690 |
|
13.01.2017, 20:48 [ТС] |
5 |
И что это? Где строка с присвоением данных типа size_t в Data[i][j]; , в коде только пуш в конец одной размерности — это бред. Мне надо читать текстовый файл со словами и в зависимости от слова добавлять числа в двумерный вектор размерности MxN, а если я встречаю новую строку или слово — менять размеры вектора, а потом добавлять. В первом посте был задан вопрос как изменить ширину и высоту на нужную. Добавлено через 5 минут
0 |
Каждому свое 532 / 218 / 81 Регистрация: 05.08.2013 Сообщений: 1,614 |
|
13.01.2017, 21:34 |
6 |
Ваю,
Мне надо читать текстовый файл со словами и в зависимости от слова добавлять числа в двумерный вектор размерности MxN, а если я встречаю новую строку или слово — менять размеры вектора, а потом добавлять. Вектор динамически расширяется сам! Если емкость вектора становится равным размеру, он расширяется, поэтому не нужно его вначале задавать размеры. Ты просто добавляешь элементы в вектор, а потом этот вектор добавляешь как элемент в другой вектор — получается двумерный вектор. Добавление элементов происходит за счет метода push_back. Читай из файла M и N размерности, и как я написал выше, в циклах добавляй элементы. Все! Не надо никаких обращений к вектору по индексам.
0 |
670 / 216 / 88 Регистрация: 21.07.2016 Сообщений: 1,036 Записей в блоге: 2 |
|
13.01.2017, 21:40 |
7 |
боишься за лишние перевыделения памяти? сделай v.reserve()
0 |
Каждому свое 532 / 218 / 81 Регистрация: 05.08.2013 Сообщений: 1,614 |
|
13.01.2017, 21:44 |
8 |
Ваю,
боишься за лишние перевыделения памяти? сделай v.reserve() Кстати, да! Если хочешь сразу выделить память, то метод reserve() расширяет емкость.
0 |
27 / 27 / 9 Регистрация: 21.04.2015 Сообщений: 690 |
|
14.01.2017, 00:10 [ТС] |
9 |
Я знаю, что вектор расширяет свой размер сам, но мне не так надо, мне надо создать разреженную двумерную облась даных. Я пишу голубую муть, которая называется ЛСА, там не такой смысл в нём надо изменять размеры ВСЕХ СТРОК И СТОЛБЦОВ ОДНОВРЕМЕННО В ОБЕ СТОРОНЫ после считывания КАЖДОГО слова из файла, как в большую, так и в меньшую, для чего мне нужно РУЧНОЕ управление размером прямоугольной области ДО записи в неё данных
0 |
Lyosha12 41 / 41 / 11 Регистрация: 02.04.2016 Сообщений: 308 |
||||
14.01.2017, 05:01 |
10 |
|||
Так как вектор векторов — это вектор объектов типа вектор, то можно обратиться к конкретному внутреннему вектору из внешнего, а уже с ним проводить операции.
0 |
Объявление вектора
Вектор в STL — это аналог массива, контейнер, который позволяет осуществлять доступ к элементам по индексам. Вектор является шаблоном, и объявляется, как все остальные шаблоны.
Например, вектор целых чисел можно объявить так:
vector <int> A;
При таком создании вектор является «пустым», не содержащим элементов. Можно сразу же объявить вектор некоторого фиксированного размера, если задать конструктор, указав в конструкторе количество элементов вектора:
vector <int> A(n);
В этом случае значения элементов вектора будут нулевыми (а если элементами вектора являются не числа, а, например, строки или другие структуры данных, то элементы вектора будут принимать значения по умолчанию, то есть строки и вложенные вектора будут пустыми). При необходимости можно сразу же заполнить вектор некоторыми (одинаковыми), значениями, указав их в качестве второго параметра конструктора, например, для заполнения вектора значениями -1 можно его объявить так:
vector<int> A(n, -1);
Для использования контейнера vector необходимо подключить заголовочный файл vector:
#include<vector>
Обращение к элементам вектора
К элементам вектора можно обращаться по индексу, например, так: A[i].
Есть и другой способ обращения к элементу вектора с индексом i: использование метода at: A.at(i). Отличие метода at от обращения при помощи квадратных скобок в том, что при использовании метода at происходит проверка правильности индекса, и в случае выхода за границы вектора происходит ошибка исполнения. Это полезно при отладке программ.
При обращении к элементам вектора при помощи квадратных скобок корректность индекса не проверяется, и в случае выхода за границы вектора дальнейшее поведение программы может быть непредсказуемым.
Следует отметить, что работа с элементами вектора осуществляется медленнее, чем с элементами массива (даже при использовании квадратных скобок, то есть без проверки выхода за границы массива).
Помимо этого у вектора есть метод front(), возвращающий ссылку на первый элемент и метод back(), возвращающий ссылку на последний элемент вектора.
Изменение размера вектора
Размер вектора можно узнать при помощи универсального метода size(), возвращающего для всех контейнеров в STL их размер. Также есть метод empty(), возвращающий логическое значение (true, если вектор пустой).
Размер вектора можно изменить в любой момент, при помощи метода resize. У этого метода может быть один или два параметра. Вызов метода resize(n) изменяет размер вектора до n элементов (длина вектора может как уменьшится, так и увеличиться). Вызов метода resize(n, val) изменяет размер вектора до n элементов, и если при этом размер вектора увеличивается, то новые элементы получают значение, равное val.
Очень часто бывает полезно добавлять элементы в конец вектора по одному и удалять элементы из конца вектора по одному. Для добавления нового элемента, равного val, в конец вектора, используется метод push_back(val). Для удаления последнего элемента вектора используется метод pop_back() — он не возвращает значения.
Добавление элемента в конец вектора осуществляется в среднем за O(1). Это реализовано за счет того, что память для хранения элементов вектора выделяется «с запасом», то есть можно будет добавлять элементы по одному, пока не кончится запас памяти. Если запас памяти исчерпан, выделяется новая память, при этом «запас» размера вектора удваивается.
Очистить вектор можно при помощи метода clear().
Вставка и удаление элементов в середину вектора
Метод erase позволяет удалять из середины вектора один или несколько элементов. Этот метод работает с итераторами. Подробней про его использование можно прочитать в документации.
Метод insert позволяет вставлять в середину вектора новый элемент, или несколько равных элементов, или другой вектор, или фрагмент другого вектора. Этот метод также работает с итераторами и про его использование можно прочитать в документации.
Поскольку вставка и удаление элементов требуют сдвига других элементов вектора, эти операции имеют линейную сложность, то есть выполняются за время, пропорциональное длине вектора.
Присваивание и сравнение векторов
Содержимое одного вектора можно целиком скопировать в другой вектор при помощи операции присваивания: A = B.
Также вектора можно сравнивать на равенство и неравенство (A == B, A != B), и сравнивать их содержимое в лексикографическом порядке (A < B, A <= B, A > B, A >= B).
Создание многомерных векторов
Элементами вектора могут быть и другие вектора. Например, можно сделать вектор, каждый элемент которого представляет собой вектор целых чисел:
vector < vector <int> > a;
Тем самым, a[i] будет вектором целых чисел, а обращаться к j-му элементу вектора a[i] можно через a[i][j].
Чтобы создать двумерный вектор размером n×m можно внешний вектор объявить размером n, а затем в цикле изменить размер каждого вложенного вектора:
vector < vector <int> > a(n);
for (int i = 0; i < n; ++i)
a[i].resize(m);
Но можно сделать это и в одну строку, если передать вторым параметром для конструктора вектора конструктор, который создает вектор целых чисел длины m:
vector < vector <int> > a(n, vector<int>(m));
Заметим, что размеры вложенных векторов могут изменяться и быть различными.
Также можно создавать вектор из стеков, очередей, деков, можно создавать трехмерные векторы и т.д.