В чем разница между вектором и массивом в C++?

C++ Программирование и разработка

В C ++ существует много различий между вектором и массивом. Однако главное сходство очень важно. Основное сходство заключается в том, что оба они представляют собой список, и каждый из них может содержать последовательность данных одного и того же типа. Основные отличия заключаются в следующем: размер (длина) вектора может быть увеличен естественным образом, но размер массива является фиксированным и не может быть увеличен. Элементы могут быть вставлены в вектор, но не могут быть вставлены в массив. Элементы могут быть добавлены в конце вектора, но не могут быть добавлены в конце массива. Вектор — это класс, из которого создаются экземпляры других векторных объектов, но массив является постоянным указателем на последовательность данных того же типа. У вектора есть методы (функции-члены), но у массива их нет, поэтому вектор называется структурой данных. Хотя указатель можно использовать с массивом, итераторы используются с вектором. Итератор — это разработанный указатель.

Перед массивом нельзя включать ни один элемент. В C ++ 17 и выше элемент может быть включен перед вектором с помощью функции-члена emplace ().

В оставшейся части этой статьи проиллюстрированы различия между вектором и массивом. Для каждой точки упоминается недееспособность массива или дается его грубый или громоздкий способ достижения той же цели.

Создание вектора или массива

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

vector<char> vtr = {‘A’, ‘B’, ‘C’, ‘D’,‘E’};

Соответственно, массив будет создан следующим образом:

char arr[] = {‘A’, ‘B’, ‘C’, ‘D’,‘E’};

Обратите внимание на разницу в операндах слева от оператора присваивания. Затем количество элементов вектора может быть добавлено или уменьшено, но размер массива остается фиксированным, в данном случае 5.

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

#include <vector>

using namespace std;

Чтобы иметь и использовать массив в программе, директива препроцессора не требуется.

Увеличение размера

В следующем коде показано, как вектор из изначально двух элементов увеличивается до четырех элементов с помощью его функции-члена push_back ():

  vector<char> vtr(2);

vtr[] = ‘A’;

vtr[1] = ‘B’;

vtr.push_back(‘C’);

vtr.push_back(‘D’);

Этот код должен быть в теле функции. Для массива, поскольку массив имеет фиксированный размер, создайте массив для максимального количества предусмотренных элементов перед добавлением элементов с помощью оператора []. Пример:

  char arr[4];

arr[] = ‘A’;

arr[1] = ‘B’;

//adding elements

arr[2] = ‘C’;

arr[3] = ‘D’;

Кроме того, этот код должен находиться внутри тела функции.

Inserting

В следующем коде элемент вставляется перед элементом, на который указывает итератор, p:

    vectorvtr = {‘A’, ‘B’, ‘D’, ‘E’};
vector::iterator p = vtr.begin();
++p;
++p;
char ch = ‘C’;
vtr.insert(p, ch);

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

Результат:

A B C D E

Первый оператор кода создает векторный объект. Буква C, которая должна была стоять перед буквой D в алфавитном порядке, здесь отсутствует. Вторая инструкция возвращает итератор, указывающий на первый элемент вектора. Следующие два оператора увеличивают указатель до точки «D». Утверждение после присваивает букву «C» гл. В этом сегменте кода последний оператор вставляет букву «C» перед буквой «D» с помощью итератора.

Читайте также:  Функциональное программирование или ООП: что лучше для вас?

Что касается массива, то нет возможности вставить элемент. Из-за подобных ограничений для массива были разработаны векторные и другие контейнеры.

Примечание. Функцию-член insert () также можно использовать для вставки элемента перед вектором.

Appending

Добавление означает добавление элементов сзади. Функцию-член push_back () можно использовать для добавления элементов в конец вектора — см. Выше. Массив нельзя добавить. Единственный способ обойти эту проблему для массива — создать массив максимально предусмотренного размера. Вставляйте элементы с самого начала. Тогда в массиве останется некоторое пространство (ячейки). Затем, если есть необходимость добавить элементы сзади, поместите элементы (значения) в пустые пространства позади (со значениями по умолчанию).

Стирание элемента

Для вектора элемент можно стереть с помощью итератора. Затем итератор укажет на следующий элемент, который был там до того, как произошло стирание. Следующий код удаляет букву B:

    vectorvtr = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};
vector::iterator q = vtr.begin();
++q;
vtr.erase(q);

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

Результат:

A C D E

C

Ни один элемент массива нельзя стереть, но его можно изменить.

Clear

Все элементы вектора могут быть удалены с помощью его функции-члена clear () следующим образом:

    vectorvtr = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};
vtr.clear();

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

На выходе ничего нет. Лучшее, что можно сделать с массивом, — это заменить все элементы некоторым значением по умолчанию. Для целого числа значение по умолчанию равно 0. Следующий код иллюстрирует:

    int arr[] = {1, 2, 3, 4, 5};

for (int i=; i<5; i++) {
arr[i] = ;
}

for (int i=; i<5; i++) {
cout<<arr[i] << ‘ ‘;
}

Результат:

    

Для этого символа значением по умолчанию является нулевой символ, \ 0. Следующий код иллюстрирует:

    char arr[] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};

for (int i=; i<5; i++) {
arr[i] = \0;
}

for (int i=; i<5; i++) {
cout<<arr[i] << ‘ ‘;
}

Вывод ничего не показывает.

Swapping

Даже если два вектора имеют разный размер, их элементы можно поменять местами с помощью функции-члена swap (). Следующий код показывает это:

    vector vtr1 = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};
vector vtr2 = {‘F’, ‘G’, ‘H’};

vtr1.swap(vtr2);

cout<< «Content of new vtr1:» <<endl;
for (int i=; i<vtr1.size(); i++) {
cout<< vtr1[i] << ‘ ‘;
}
cout<<endl;
cout<< «Content of new vtr:» <<endl;
for (int i=; i<vtr2.size(); i++) {
cout<< vtr2[i] << ‘ ‘;
}

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

    char arr1[] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};
char arr2[] = {‘F’, ‘G’, ‘H’, ‘I’, ‘J’};

for (int i=; i<5; i++) {
char temp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = temp;
}

cout<< «Content of new arr1:» <<endl;
for (int i=; i<5; i++) {
cout<< arr1[i] << ‘ ‘;
}
cout<<endl;
cout<< «Content of new arr2:» <<endl;
for (int i=; i<5; i++) {
cout<< arr2[i] << ‘ ‘;
}

Результат:

Content of new arr1:

F G H I J

Content of new arr2:

A B C D E

Size

Размер вектора возвращается его функцией-членом size (). То есть определяется во время выполнения. Иллюстрация:

vectorvtr = {‘A’, ‘B’, ‘C’, ‘D’};
int sz = vtr.size();
cout<<sz<<endl;

Результатом будет 4. Размер массива должен быть указан в начале, как показано в следующем коде:

char arr[4] = {‘A’, ‘B’, ‘C’, ‘D’};

Также это можно сделать так:

char arr[7] = {‘A’, ‘B’, ‘C’, ‘D’};

То есть поставить число (размер), превышающее предполагаемый размер (в данном случае — 4). Однако количество не должно быть меньше количества исходных элементов.

Читайте также:  Простое руководство по интерфейсам Typescript: объявление и варианты использования

Массив переменной длины

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

    #include <iostream>

#include <vector>

using namespace std;

void fn(int n) {
char arr[n];
arr[] = ‘A’;
arr[1] = ‘B’;
arr[2] = ‘C’;
arr[3] = ‘D’;

for (int i=; i<n; i++) {
cout<<arr[i] << ‘ ‘;
}
cout<<endl;
}

int main()
{
fn(4);

return ;
}

Результат:

A B C D

Заключение

Основные различия между вектором и массивом заключаются в следующем: размер (длина) вектора может быть увеличен естественным образом, но размер массива является фиксированным и не может быть увеличен. Элементы могут быть вставлены в вектор, но не могут быть вставлены в массив. Элементы могут быть добавлены в конце вектора, но не могут быть добавлены в конце массива. Вектор — это класс, из которого создаются экземпляры других векторных объектов, но массив является постоянным указателем на последовательность данных того же типа. У вектора есть методы (функции-члены), но у массива их нет, поэтому вектор называется структурой данных. Хотя указатель может использоваться с массивом, итераторы используются с вектором. Итератор — это разработанный указатель. Массив либо показывает свою неспособность, либо имеет грубый или громоздкий способ достижения одной и той же цели для каждой разницы.

Оцените статью
bestprogrammer.ru
Добавить комментарий