Как расширить вектор в C++?

Как преобразовать строку в int в C++ Программирование и разработка

Если «развернуть» здесь означает включить в вектор больше элементов, чтобы его размер (длина) увеличился, то вектор может быть расширен. Однако «расширение вектора» — не классическая фраза в C ++. Фактически, «расширение» в C ++ фактически означает замену имени объекта значениями его содержимого. Если вектор состоит из строковых литералов, то вектор может быть заменен одной строкой, состоящей из строковых литералов. Однако это нужно делать вручную. То есть это должен делать программист, а не библиотека.

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

У вектора есть функции-члены. Его размер можно увеличить с помощью функций-членов: resize (), insert (), emplace () и push_back (). В этой статье объясняются различные способы расширения вектора, то есть увеличения его размера; а в случае вектора строковых литералов заменяется всеми строковыми литералами.

Выполняйте векторное кодирование внутри тела функции main (), если нет веской причины сделать это перед телом функции main (). Не забудьте начать программу с:

#include <iostream>

#include <vector>

using namespace std;

Вектор строк в одну строку

Вектор строковых литералов можно заменить одной строкой литералов. Литералы будут разделены запятыми в одной строке. Следующий код иллюстрирует это:

vectorvtr = {«Toyota», «Mitsubishi», «Ford», «Mercedes», «Jeep»};

char arrChars[100];
int ctr = 0;    //counter
int i=0;
for (i=0; i<vtr.size(); i++) {
const char* str = vtr[i];
int j=0;
for (j=0; str[j] != \0; j++) {
arrChars[ctr] = str[j];
++ctr;
}
arrChars[ctr] = ‘,’;  ++ctr; arrChars[ctr] = ‘ ‘;
++ctr;
}

arrChars[ctr] = \0;

cout<<arrChars<<endl;

Результат:

Toyota, Mitsubishi, Ford, Mercedes, Jeep,

это одна длинная строка. Строка массива и строковый литерал в двойных кавычках по сути одно и то же, заканчиваясь на ’\ 0′; хотя окончание строкового литерала в двойных кавычках неявно. Последняя длинная строка имеет только один ’\ 0′ в конце последовательности символов. Код все еще можно изменить, удалив последнюю запятую и пробел.

Увеличение размера вектора

Изменение размера

Функцию-член size () можно использовать для возврата size () вектора, как показано в следующем коде:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
cout<<vtr.size() <<endl;

Выход 5.

void resize(size_type sz)

Чтобы увеличить размер вектора, его нужно увеличить до большего числа. Следующий код делает это с помощью функции-члена resize (size_type sz):

    vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vtr.resize(7);
vtr[5] = ‘K’;
vtr[6] = ‘L’;

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G H I J K L

Когда размер вектора просто изменяется с помощью функции-члена resize (), новые пустые местоположения становятся доступными ближе к концу вектора. Затем эти новые места можно заполнить.

void resize(size_type sz, const T& c)

То же значение можно добавить к новым местоположениям ближе к концу вектора, используя этот перегруженный метод resize (). Иллюстрация:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vtr.resize(8, ‘Z’);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G H I J Z Z Z

Вставка

Вставка происходит перед элементом, на который указывает итератор.

insert(const_iterator position, const T& x)

Следующий код показывает, как используется эта функция:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vector::iterator p = vtr.begin();
p++, p++;

char id = ‘Z’;
vtr.insert(p, id);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G Z H I J

«Z» вставлено перед буквой H. Функция-член begin () возвращает итератор, указывающий на первый элемент вектора. Затем итератор может быть увеличен до желаемой позиции. Обратите внимание, что ожидаемый второй аргумент для insert () здесь — идентификатор.

iterator insert(const_iterator position, T&& x)

Следующий код показывает, как используется эта функция:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vector::iterator p = vtr.begin();
p++, p++;

vtr.insert(p, ‘Z’);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G Z H I J

«Z» вставлено перед буквой H. Функция-член begin () возвращает итератор, указывающий на первый элемент вектора. Обратите внимание, что ожидаемый второй аргумент для insert () здесь — литерал.

iterator insert(const_iterator position, size_type n, const T& x)

Одно и то же значение можно вставить более одного раза. Следующий код иллюстрирует это:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vector::iterator p = vtr.begin();
p++, p++;

char id = ‘Z’;
vtr.insert(p, 3, id);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G Z Z Z H I J

вставка итератора (позиция const_iterator, сначала InputIterator, затем — InputIterator)

Может быть вставлен диапазон из другого вектора. Следующий код иллюстрирует это:

vector otherVtr = {‘K’, ‘L’, ‘M’, ‘N’, ‘O’};
vector::iterator i = otherVtr.begin();
= i + 1;
vector::iterator j = otherVtr.end();
= j  2;

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vector::iterator p = vtr.begin();
p++, p++;

vtr.insert(p, i, j);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G L M H I J

Для другого вектора диапазон получается следующим образом: функция-член begin () возвращает итератор, указывающий на свой первый элемент. Этот итератор, я был увеличен, чтобы указывать на следующий элемент. Функция-член end () возвращает итератор, который указывает сразу после последнего элемента. Этот итератор j был дважды уменьшен путем вычитания из него 2, а затем указывал на элемент «N».

На данный момент предполагаемый диапазон:

‘L’, ‘M’, ‘N’

Однако в C ++ последний элемент диапазона не будет задействован (вставлен). Итак, вставляются только «L», «M».

iterator insert(const_iterator position, initializer_list<T> il)

Можно вставить список векторных литералов. Следующий код иллюстрирует это:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vector::iterator p = vtr.begin();
p++, p++;

vtr.insert(p, {‘K’, ‘L’, ‘M’, ‘N’, ‘O’});

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G K L M N O H I J

Emplace

Использование emplace () аналогично использованию insert (), и многие программисты предпочитают использовать insert ().

Emplace within

В следующем коде «Z» помещается в значения «F», «G», «H», «I», «J»:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vector::iterator p = vtr.begin();
p++, p++;

vtr.emplace(p, ‘Z’);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Emplace in front

Для следующего кода «Z» помещается перед значениями «F», «G», «H», «I», «J»:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
vector::iterator p = vtr.begin();

vtr.emplace(p, ‘Z’);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Итератор, возвращаемый функцией begin (), не увеличивался; и поэтому вывод:

Z F G H I J

Push_Back

Функция-член push_back () может использоваться для добавления элемента. Следующий код иллюстрирует это:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};

vtr.push_back(‘Z’);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G H I J Z

Элемент также можно добавить с помощью функции-члена emplace_back (). Следующий код иллюстрирует это:

vectorvtr{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};

vtr.emplace_back(‘Z’);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

Результат:

F G H I J Z

Зная длину вектора

Размер вектора означает количество элементов в векторе. Это можно получить с помощью функции-члена size (). Следующая программа иллюстрирует это:

#include
#include
using namespace std;

int main()
{

vectorvtr = {‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’};

int sz = vtr.size();

cout<<sz<<endl;

return 0;
}

На выходе 6.

Емкость вектора

Емкость вектора не следует путать с размером вектора. Когда вектор манипулируется и увеличивается, расположение его элементов в памяти компьютера изменяется (перераспределяется). Емкость вектора — это общее количество элементов, которые вектор может содержать без необходимости перераспределения. Он откладывается с начальным размером вектора. Следующая программа иллюстрирует это для пустого вектора и для вектора из 5 элементов:

#include
#include
using namespace std;

int main()
{
vector vtr1;
vector vtr2{‘F’, ‘G’, ‘H’, ‘I’, ‘J’};

int cap1 = vtr1.capacity();
int cap2 = vtr2.capacity();

cout<< cap1 <<endl;
cout<< cap2 <<endl;

return 0;
}

Результат:

0

5

Reserving Space for Vector

void reserve(size_type n)

С помощью этой функции можно зарезервировать векторное пространство. Следующая программа резервирует место из 5 элементов:

#include
#include
using namespace std;
int main()
{
vectorvtr = {‘F’, ‘G’, ‘H’};

vtr.reserve(5);
int cap = vtr.capacity();

cout<< «New Capacity: « << cap <<endl;

vtr.push_back(‘I’);
vtr.push_back(‘J’);
vtr.push_back(‘K’);

for (int i=0; i<vtr.size(); i++) {
cout<<vtr[i] << ‘ ‘;
}
cout<<endl;

return 0;
}

Результат:

New Capacity: 5

F G H I J K

Зарезервированные пробелы включают те, которые предназначены для начальных элементов. Тот факт, что было зарезервировано 5 пробелов, не означает, что к элементу нельзя добавить более 5 элементов.

Заключение

«Расширение вектора» — это не классическая фраза в C ++. Однако, если «расширение вектора» означает увеличение длины вектора, тогда, да, вектор может быть расширен. В C ++ длина вектора или любого контейнера C ++ называется размером. Вектор можно расширить с помощью следующих функций-членов: resize (), insert (), emplace () и push_back (). Другие связанные функции-члены: size (), capacity () и reserve (). Во многих программах на C ++ вектор будет увеличиваться и уменьшаться в несколько раз. Вектор можно уменьшить, используя функцию-член стирания — см. Ниже. Если вектор состоит из строковых литералов, то вектор можно заменить одной длинной строкой, состоящей из строковых литералов.

Читайте также:  Как использовать QTimer
Оцените статью
bestprogrammer.ru
Добавить комментарий