Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm list::emplace() trong C++ STL

list::emplace() chèn phần tử mới vào list tại vị trí chỉ định, xây dựng trực tiếp (in-place) tránh copy/move.

Cú pháp

iterator emplace(const_iterator position, Args&&... args);
  • position: iterator vị trí chèn (trước vị trí này)
  • args: đối số truyền cho constructor của phần tử
  • Trả về: iterator trỏ đến phần tử vừa chèn

Ví dụ

#include <iostream>
#include <list>
using namespace std;

int main() {
    list<int> Lt = {3, 4, 5};
    
    // Chèn 7 vào đầu
    auto itr = Lt.emplace(Lt.begin(), 7);
    
    // Chèn 6 trước 7 (itr trỏ đến 7)
    Lt.emplace(itr, 6);
    
    cout << "The List is: ";
    for (auto it = Lt.begin(); it != Lt.end(); ++it)
        cout << *it << " ";
    return 0;
}

Kết quả

The List is: 6 7 3 4 5

Giải thích:

  1. Ban đầu: {3, 4, 5}
  2. emplace(begin(), 7) → chèn 7 trước 3 → {7, 3, 4, 5}, trả về iterator trỏ 7
  3. emplace(itr, 6) → chèn 6 trước 7 → {6, 7, 3, 4, 5}

emplace() vs insert()

  • insert: yêu cầu đối tượng đã tạo sẵn (copy/move)
  • emplace: chuyển tiếp đối số đến constructor, tạo trực tiếp tại chỗ (perfect forwarding)
  • Hiệu quả hơn cho kiểu phức tạp (có constructor phức tạp)

Với int thì tương đương, nhưng với class có constructor nhiều tham số, emplace tránh tạo đối tượng tạm.