push_back() против emplace_back() в векторах C++ STL

Опубликовано: 14 Сентября, 2022

В C++ векторы — это динамические массивы, которые могут увеличиваться или уменьшаться, а их хранением занимается сам контейнер. Есть два способа вставки элемента в вектор. Это push_back() и emplace_back(). В этой статье мы обсудим разницу между ними.

отталкивать():

Этот метод используется для вставки элементов в вектор с конца контейнера. Поскольку гибкость размера вектора является динамической, размер контейнера также увеличивается на 1 после вставки любого нового элемента.

Программа 1:

Объяснение:

  • Каждый раз, когда push_back значение в вектор, cpp создаст новый вектор, который скопирует новое значение из параметра и все значения в старом векторе.
  • В основной функции создается вектор (вектор1) класса GFG размером 0 . При использовании GFG(int) в качестве параметра он создается с помощью параметризованного конструктора, а поскольку вектор имеет тип GFG, объект передается конструктору копирования « GFG », поэтому « Copied » печатается один раз.
  • Когда второе значение GFG было отправлено _back , новый вектор (vector2) будет создан с большим размером и скопирован в него GFG (11). А затем все значения в старом векторе, который ссылается на вектор1{1} , копируются в вектор2, поэтому « Копировано » печатается дважды, когда второй GFG был push_back.
  • Аналогично, когда необходимо создать третий объект, в памяти выделяется новый вектор большего размера, копируется первый элемент, затем копируется второй элемент, а затем копируется третий элемент. Следовательно, « Copied » печатается трижды, так как конструктор копирования вызывается трижды, по одному разу для каждого вставленного элемента.
  • Однако, если размер вектора фиксирован, то перед вставкой любого элемента количество раз, которое будет напечатано «Copied», равно одному. Это связано с тем, что при объявлении требуемого размера повторное копирование элементов при каждой вставке не происходит.

Примечание. Reserve() используется вместо использования «vector<Point> vertices(3)» , так как приведенный ниже синтаксис иногда не работает, поскольку в классе не определен конструктор по умолчанию.

"vector<GFG> vertices(3);”

Программа 2:
Стоимость за счет копирования элементов высока. Ниже приведена программа для оптимизации использования векторов C++ для снижения стоимости копирования элементов:

emplace_back():

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

Программа 3:

Объяснение: В приведенной выше программе ничего не печатается, так как копирование конструктора не происходит при использовании функции emplace_back() .

Давайте посмотрим разницу между в табличной форме -:

Отталкивать emplace_back
1. Используется для вставки элемента в вектор или строку. Он используется для вставки элемента в вектор или строку.
2. Это медленнее. Это быстрее.
3.

Его синтаксис:

push_back(value_to_insert)

Его синтаксис -:

emplace_back (value_to_insert)

4. push_back принимает единственный объект типа, если конструктор принимает более одного аргумента emplace_back принимает аргументы конструктора типа.