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:
- Ban đầu: {3, 4, 5}
emplace(begin(), 7)→ chèn 7 trước 3 → {7, 3, 4, 5}, trả về iterator trỏ 7emplace(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.