Перейти к содержимому

Pop back c что делает

  • автор:

Pop back 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

Векторы в C++ — урок 12

Вектор в C++ — это замена стандартному динамическому массиву, память для которого выделяется вручную, с помощью оператора new .

Разработчики языка рекомендуют в использовать именно vector вместо ручного выделения памяти для массива. Это позволяет избежать утечек памяти и облегчает работу программисту.

  • Пример создания вектора
  • Управление элементами вектора
  • Методы класса vector

Пример создания вектора

 #include int main() < // Вектор из 10 элементов типа int std::vectorv1(10); // Вектор из элементов типа float // С неопределенным размером std::vector v2; // Вектор, состоящий из 10 элементов типа int // По умолчанию все элементы заполняются нулями std::vector v3(10, 0); return 0; > 

Управление элементами вектора

Создадим вектор, в котором будет содержаться произвольное количество фамилий студентов.

 #include #include int main() < // Поддержка кириллицы в консоли Windows setlocale(LC_ALL, ""); // Создание вектора из строк std::vectorstudents; // Буфер для ввода фамилии студента std::string buffer = ""; std::cout 0) < // Добавление элемента в конец вектора students.push_back(buffer); >> while (buffer != ""); // Сохраняем количество элементов вектора unsigned int vector_size = students.size(); // Вывод заполненного вектора на экран std::cout return 0; > 

Результат работы программы:

Методы класса vector

Для добавления нового элемента в конец вектора используется метод push_back() . Количество элементов определяется методом size() . Для доступа к элементам вектора можно использовать квадратные скобки [] , также, как и для обычных массивов.

  • pop_back() — удалить последний элемент
  • clear() — удалить все элементы вектора
  • empty() — проверить вектор на пустоту

Подробное описание всех методов std::vector (на английском) есть на C++ Reference.

Реализация pop_back для вектора

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

if (mSize) --mSize; 

Другое дело — вызывать ли деструктор для элемента явно или оставить элемент как есть. Это зависит от того, как именно вы работаете с элементами — добавляете новый путем вызова конструктора копирования или при помощи присваивания.

Отслеживать
ответ дан 26 дек 2017 в 8:58
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
да мне нужно через деструктор удалять
26 дек 2017 в 9:03

Ну, тогда дополнительно удаляете вызовом деструктора, только учтите, что при удалении потом delete[]mVector; деструкторы будут вызваны повторно. Ну и в push_back вы тогда не должны использовать присваивание — потому что при этом опять же в этом элементе после деструктора уже нет нормального объекта.

26 дек 2017 в 9:06
а как мне вызывать деструктор последнего элемента? который я хочу удалить
26 дек 2017 в 9:07
@ОксанаВолинець, mVector[mSize-1].~T();
26 дек 2017 в 9:09

Один из вариантов выглядит так:

template void Vector::PopBack() < if(isEmpty())< return; >--mSize; mVector[mSize].~T(); > 

Но если вы планируете вызывать деструктор явно, то вам следует пересмотреть алгоритм выделения/освобождения памяти. Так как new T[] / delete[] может привести к повторному вызову деструктора.

В общих чертах, это могло бы выглядеть так:

template class Vector < int mSize; int mCapacity; T *mVector; public: Vector(): mSize(0), mCapacity(42), mVector(allocate(mCapacity)) <>T* begin() < return mVector; >T* end() < return mVector + mSize; >bool isEmpty() const < return mSize == 0; >void popBack() < if(isEmpty())< return; >--mSize; destroy(end()); > ~Vector() < for(T &object : *this)< destroy(&object); >deallocate(mVector); > private: static void construct(T *object) < new(object) T; >static void destroy(T *object)< object->~T(); > static T* allocate(int count)< return static_cast(malloc(count * sizeof(T))); > static void deallocate(void *ptr) < free(ptr); >>; 

Как видите, вся работа с выделением/освобождением памяти происходит в методах allocate / deallocate . В методе allocate выделяется кусок памяти при помощи malloc . В методе deallocate этот кусок памяти освобождается. Никаких конструкторов и деструкторов автоматически не вызывается. Эти операции нам придется делать вручную. Для этих целей есть методы construct / destroy .

Конструктор, деструктор, и метод popBack в этом примере реализованы. Аналогично при помощи методов allocate , deallocate , construct и destroy можно реализовать остальные.

P.S. Кстати, примерно таким же образом работает с памятью стандартный вектор. Только у него все эти методы вынесены в отдельный класс std::allocator . Но вам для простоты можно объявить их прямо в теле вектора.

C++. Класс vector. Методы, изменяющие данные в массиве

Класс vector. Методы, изменяющие данные в массиве. Методы push_back() , pop_back() , clear() , swap() , operator=() , erase() , insert() , assign()

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:

Поиск на других ресурсах:

1. Метод push_back() . Добавить элемент в конец вектора

Чтобы добавить элемент в конец массива используется метод push_back() . Метод имеет 2 перегруженные реализации, синтаксис объявления которых следующий

void vectorT>::push_back(T&& val) void vectorT>::push_back(const T& val)

здесь T – тип элементов вектора.

Пример.

. // Метод push_back() - добавить элемент в конец вектора. // 1. Объявить вектор из 10 элементов типа long long. vectorlong long> A(10); // 2. Заполнить массив данными for (int i = 0; i < A.size(); i++) A[i] = i * i; // 3. Добавить элемент в конец массива A.push_back(10000L); // 4. Получить новую длину массива int count = A.size(); // count = 11 .
2. Метод pop_back() . Удалить последний элемент вектора

Для удаления последнего элемента динамического массива используется метод pop_back() . Синтаксис объявления метода следующий

void vectorT>::pop_back()

здесь T – тип элементов массива.

Пример.

. // Метод pop_back() - удалить последний элемент из массива. // 1. Объявить указатель на вектор из 5 елементов типа float. vectorfloat>* A = new vectorfloat>(5); // 2. Заполнить массив данными A->at(0) = 2.88f; A->at(1) = 3.8f; A->operator[](2) = 4.4f; // так тоже можно A->at(3) = 4.9f; A->at(4) = 5.5f; // 3. Вывести массив в строку for (int i = 0; i < A->size(); i++) cout at(i) " "; // 4. Удалить последний элемент A->pop_back(); // 5. Получить новую длину массива int count = A->size(); // count = 4 .
3. Метод clear() . Удаляет из массива все элементы

Метод clear() предназначен для удаления из массива всех элементов. Длина массива, которая возвращается методом size() , становится равной 0. Синтаксис объявления метода clear() следующий:

void vectorT>::clear()

здесь T – тип элементов массива.

Пример.

. // Метод clear() - удаляет из массива все элементы. // 1. Объявить вектор из 10 элементов типа short. vectorshort> A(10); // 2. Заполнить массив данными for (int i = 0; i < A.size(); i++) A.at(i) = i; // 3. Вывести размер массива cout // 10 // 4. Удалить из массива все элементы A.clear(); // 5. Повторно вывести размер массива cout // 0 .
4. Метод swap() . Обмен местами двух векторов

Метод swap() используется для обмена двух векторов местами. Типы векторов должны совпадать. Общая форма объявления метода следующая

void vectorT>::swap(vectorT>& _Right)
  • T – тип элементов вектора;
  • _Right – массив, который обменивается с текущим массивом.

Пример.

. // Метод swap() - обмен векторов местами // 1. Объявить два массива vectorshort> A1; vectorshort> A2; // 2. Заполнить массив данными initializer_listshort> L1 = < 1, 2, 3, 4 >; initializer_listshort> L2 = < 5, 6, 7, 8, 9 >; A1.assign(L1); // A1 = A2.assign(L2); // A2 = // 3. Обменять местами два массива A1.swap(A2); // A1 = < 5, 6, 7, 8, 9 >, A2 = .
5. Присваивание массивов. Перегруженный оператор =

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

Приклад.

. // Присваивание массивов // 1. Создать массив целых чисел на основе списка инициализации initializer_listint> L = < 1, 2, 3, 4, 5 >; vectorint> A1(L); // A1 = // 2. Объявить другой пустой массив vectorint> A2; // 3. Присвоить один массив другому A2 = A1; // A2 = .
6. Метод erase() . Удалить элемент или несколько элементов указанного диапазона

Метод erase() используется для удаления элементов из динамического массива типа vector . Метод имеет две перегруженные реализации.
Первая реализация имеет следующий синтаксис:

vectorT>::iterator erase(vectorT>::const_iterator First, vectorT>::const_iterator Last)
  • T – тип элементов массива;
  • First – итератор, который указывает на первый элемент удаляемого диапазона;
  • Last – итератор, указывающий на элемент, находящийся за последним элементом удаляемого диапазона.
    Данная реализация метода erase() возвращает итератор, указывающий на фрагмент исходного массива, который начинается с итератора Last .

Вторая реализация имеет синтаксис:

vectorT>::iterator erase(vectorT>::const_iterator Where)
  • T – тип элементов массива;
  • Where – итератор, указывающий на элемент в массиве, который нужно удалить.

В этой реализации возвращается итератор, указывающий на начало исходного массива.

Пример. В примере приведена демонстрационная программа, в которой используется метод erase() .

#include iostream> #include vector> using namespace std; void main() < // 1. Создать вектор из 10 целых чисел vectorint> A(10); // 2. Заполнить вектор данными: A = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] for (int i = 0; i < A.size(); i++) A[i] = i; // 3. Вывести массив A на экран cout «A color: #0000ff;»>for (int i = 0; i < A.size(); i++) cout << A[i] " "; cout // 4. Удалить элементы с индексами от 2 до 4 включительно // 4.1. Объявить 3 итератора vectorint>::iterator it1 = A.begin() + 2; // итератор указывает на элемент с индексом 2 vectorint>::iterator it2 = A.begin() + 5; // итератор указывает на элемент с индексом 5 vectorint>::iterator it3; // итератор, который будет указывать на другой фрагмент массива A // 4.2. Вызов метода erase() — удалить фрагмент it3 = A.erase(it1, it2); // A = [ 0, 1, 5, 6, 7, 8, 9 ] // 5. Вывести результат по итератору it3. // Итератор указывает на фрагмент массива it3 => [ 5, 6, 7, 8, 9 ] cout «it3 => «; while (it3 != A.end()) < cout << *it3 " "; it3++; > cout // 6. Вывести массив после удаления: A = [ 0, 1, 5, 6, 7, 8, 9 ] cout «A color: #0000ff;»>for (int i = 0; i < A.size(); i++) cout << A[i] " "; cout // 7. Удалить первый элемент в массиве // 7.1. Объявить итератор на первый элемент массива vectorint>::iterator it4 = A.begin(); // 7.2. Вызвать метод erase() с параметром одиночного итератора A.erase(it4); // 7.3. Вывести массив A опять cout «A color: #0000ff;»>for (int i = 0; i < A.size(); i++) cout << A[i] " "; cout

Результат выполнения программы

A = 0 1 2 3 4 5 6 7 8 9 it3 => 5 6 7 8 9 A = 0 1 5 6 7 8 9 A = 1 5 6 7 8 9
7. Метод insert() . Вставляет элемент или группу элементов в вектор

Метод insert() обеспечивает несколько разновидностей вставки одного или нескольких элементов в массив. Каждая разновидность определена отдельной перегруженной реализацией метода.

7.1. Вставка списка инициализации в вектор

При этом способе вставки объявление метода insert() следующее:

vectorT>::iterator insert( vectorT>::const_iterator _Where, initializer_list _Ilist )
  • T – тип элементов массива;
  • initializer_list – тип списка инициализации;
  • _Where – итератор, указывающий на позицию вставки;
  • _Ilist – список инициализации.

Метод возвращает итератор, указывающий на начало фрагмента вставки.

Пример.

#include iostream> #include vector> using namespace std; void main() < // Метод insert() - вставка списка инициализации в вектор // 1. Объявить массив из 5 элементов типа double vectordouble> A(5); // 2. Заполнить массив числами 1.0 A.assign(5, 1.0); // A = // 3. Вставить список инициализации в позицию 2 // 3.1. Объявить список инициализации L initializer_listdouble> L = < 2.2, 3.2 >; // 3.2. Объявить итератор и направить его на позицию 2 vectordouble>::iterator it = A.begin() + 2; // 3.3. Вызвать метод insert() vectordouble>::iterator it2; it2 = A.insert(it, L); // A = // 4. Вывести измененный массив A cout "A color: #0000ff;">for (int i = 0; i < A.size(); i++) cout << A[i] " "; cout // 5. Вывести данные по итератору cout "it2 => "; while (it2 != A.end()) < cout << *it2 " "; it2++; > >

Результат выполнения программы

A = 1 1 2.2 3.2 1 1 1 it2 => 2.2 3.2 1 1 1
7.2. Вставка элемента заданное количество раз в заданную позицию

Данная реализация метода позволяет вставить элемент в заданную позицию заданное количество раз

vectorT>::iterator insert( vectorT>::const_iterator _Where, const size_t _Count, const T& Val )
  • T – тип элементов массива;
  • _Where – итератор, указывающий на позицию вставки;
  • _Count – количество элементов Val , которые нужно вставить в массив;
  • Val – элемент, вставляемый в массив.

Пример.

#include iostream> #include vector> using namespace std; void main() < // Метод insert() - вставка элемента указанное количество раз // 1. Объявить массив из 5 элементов типа char vectorchar> A(5); // 2. Заполнить массив символами: A = for (int i = 0; i < A.size(); i++) A[i] = '-'; // 3. Вставить 4 символа '+' в позицию 3 массива // 3.1. Объявить итератор на позицию 3 vectorchar>::iterator it = A.begin() + 3; // 3.2. Вызвать метод insert() vectorchar>::iterator it2; it2 = A.insert(it, 4, '+'); // 4. Вывести результирующий массив cout "A color: #0000ff;">for (int i = 0; i < A.size(); i++) cout << A[i] " "; cout // 5. Вывести фрагмент, на который указывает итератор it2 cout "it2 => "; while (it2 != A.end()) < cout << *it2 " "; it2++; > >

Результат выполнения программы

A = - - - + + + + - - it2 => + + + + - -
7.3. Вставка одиночного элемента в заданную позицию

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

vectorT>::iterator insert(vectorT>::const_iterator _Where, T&& _Val) vectorT>::iterator insert(vectorT>::const_iterator _Where, const T& _Val)
  • T – тип элементов массива;
  • _Where – итератор, указывающий на позицию вставки;
  • _Val – вставляемое значение.

Данная форма функции возвращает итератор, указывающий на позицию вставки.

Пример.

#include iostream> #include vector> using namespace std; void main() < // Метод insert() - вставка одиночного элемента в заданную позицию // 1. Объявить массив из 5 элементов типа short vectorshort> A(5); // 2. Заполнить массив числами на основе списка инициализации initializer_listshort> L = < 1, 2, 3, 4, 5 >; A.assign(L); // 3. Вставить в позицию 0 число 100 // 3.1. Объявить итератор, который указывает на позицию 0 vectorshort>::iterator it = A.begin(); // 3.2. Вызвать метод insert() vectorshort>::iterator it2 = A.insert(it, 100); // 4. Вывести результирующий массив cout "A color: #0000ff;">for (int i = 0; i < A.size(); i++) cout << A[i] " "; cout // 5. Вывести фрагмент, на который указывает итератор it2 cout "it2 => "; while (it2 != A.end()) < cout << *it2 " "; it2++; > >

Результат выполнения программы

A = 100 1 2 3 4 5 it2 => 100 1 2 3 4 5
7.4. Вставка нескольких элементов из указанного диапазона

Для вставки группы элементов из другого массива, которые заданы диапазоном, используется следующая форма метода insert()

vectorT>::iterator insert_Iter >( vectorT>::const_iterator _Where, _Iter _First, _Iter _Last )
  • T – тип элементов массива;
  • _Where – итератор, который указывает позицию вставки в текущем массиве;
  • _First , _Last – итераторы, указывающие на позиции начала и конца диапазона массива, который есть источником.

Метод возвращает итератор, указывающий на позицию вставки.

Пример.

#include iostream> #include vector> using namespace std; void main() < // Метод insert() - вставка группы элементов, заданных диапазоном // 1. Объявить два массива vectorshort> A1(5); vectorshort> A2(5); // 2. Заполнить массивы данными initializer_listshort> L1 = < 0, 1, 2, 3, 4 >; initializer_listshort> L2 = < 5, 6, 7, 8, 9 >; A1.assign(L1); // A1 = A2.assign(L2); // A2 = // 3. Реализовать вставку элементов с индексами [1, 2, 3] массиву A2 в // позицию 3 массива A1. // Результирующий массив должен быть таким: A1 = // 3.1. Объявить итератор на массив A1, который указывает на позицию 3 vectorshort>::iterator Where = A1.begin() + 3; // 3.2. Объявить итераторы, которые указывают на диапазон [1..3] массива A2 vectorshort>::iterator First = A2.begin() + 1; vectorshort>::iterator Last = A2.begin() + 4; // следующий после 3 // 3.3. Вызвать метод insert(), получить результирующий итератор vectorshort>::iterator Result; Result = A1.insert(Where, First, Last); // 4. Вывести результирующий массив cout "A1 = < "; for (int i = 0; i < A1.size(); i++) cout << A1[i] << " "; cout ">" // 5. Вывести фрагмент, на который указывает итератор Result cout "Result => "; while (Result != A1.end()) < cout << *Result " "; Result++; > >

Результат выполнения программы

A1 = < 0 1 2 6 7 8 3 4 >Result => 6 7 8 3 4
8. Метод assign() . Создать массив из существующих данных

Метод assign() позволяет создать новый массив из существующего массива или существующих данных. Метод assign() имеет несколько перегруженных реализаций.

Первая реализация позволяет изменить существующий массив и заполнить его значениями

void assign(const size_t NewSize, const T& val)
  • T – тип элементов массива;
  • NewSize – новый размер массива (количество элементов);
  • val – значения, которыми заполняется массив.

Вторая реализация позволяет сформировать один массив из другого. Синтаксис объявления такой формы метода assign() следующий

void assign_Iter, >(_Iter First, _Iter Last)
  • _Iter – тип итератора;
  • First , Last – итераторы, указывающие на начало и конец диапазона исходного массива, из которого образуется новый массив.

Третья реализация позволяет сформировать массив из списка инициализации

void assign(initializer_listT> _Ilist)
  • T – тип элементов массива;
  • _Ilist – список инициализации.

Пример.

. // Метод assign() - получить новый массив на основе данных. // 1. Объявить массив из 0 элементов типа int vectorint> A; // 2. Заполнить массив A значениями 20 A.assign(3, 20); // A = [ 20, 20, 20 ] // 3. Объявить новый массив из чисел и заполнить его данными vectorint> A2(5); A2[0] = 10; A2[1] = 22; A2[2] = 33; A2[3] = 41; A2[4] = 54; // 4. С помощью итераторов создать массив A на основе A2. // Взять элементы с позициями от 2 до 4 включительно vectorint>::iterator iStart; vectorint>::iterator iEnd; iStart = A2.begin() + 2; // установить итератор на начало массива iEnd = A2.begin() + 5; // установить итератор на конец массива A.assign(iStart, iEnd); // A = [ 33, 41, 54 ] // 5. Создать новый массив типа float на основе списка инициализации // 5.1. Объявить список инициализации initializer_listfloat> L = < 1.5f, 2.3f, -4.2f, 3.8f >; // 5.2. Объявить пустой массив типа float vectorfloat> A3; // 5.3. Инициализировать массив A3 списком L A3.assign(L); cout "------------" for (int i = 0; i < A3.size(); i++) cout << A3[i] " "; cout 

Связанные темы

  • Общие сведения о классе vector . Обзор методов. Создание динамического массива. Способы доступа к элементам вектора
  • Методы, определяющие и изменяющие общие характеристики массива: size() , max_size() , capacity() , empty() , shrink_to_fit() , resize() , reserve()
  • Методы, обеспечивающие доступ к элементам массива: at() , front() , back() , data() , begin() , end() , cbegin() , cend() , rbegin() , rend() , crbegin() , crend()

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

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