push_back() против emplace_back() в векторах C++ STL
В 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 принимает аргументы конструктора типа. |