std::vector::emplace
#include <vector>
template <class... Args>
iterator emplace(const_iterator position, Args&&... args);
Chèn một phần tử mới vào vị trí xác định trong vector, xây dựng phần tử tại chỗ.
Tham số
pos
- Vị trí (iterator) trong vector nơi phần tử mới sẽ được tạo và chèn vào.
- Nếu
pos
không hợp lệ (ví dụ, không nằm trong vector), hành vi là không xác định (undefined behavior).
args
- Một hoặc nhiều tham số được chuyển tiếp (forward) đến hàm dựng (constructor) của phần tử.
Giá trị trả về
- Trả về một iterator trỏ tới phần tử mới được tạo trong vector.
Đặc điểm
- Hàm
emplace()
xây dựng phần tử mới trực tiếp tại vị trí được chỉ định trong vector, giúp tránh việc sao chép hoặc di chuyển đối tượng tạm thời. - Thay vì tạo một đối tượng trước và sau đó sao chép hoặc di chuyển vào vector (như
insert()
),emplace()
sẽ tạo phần tử ngay tại vị trí đó bằng cách chuyển tiếp các đối số đến hàm dựng (constructor) của phần tử. - Hiệu quả hơn
insert()
khi cần khởi tạo trực tiếp các phần tử phức tạp. - Hàm
emplace()
rất hữu ích khi làm việc với các lớp hoặc cấu trúc tùy chỉnh. Thay vì tạo một đối tượng tạm, bạn có thể trực tiếp tạo nó trong vector. - Nếu việc chèn phần tử gây ra phân bổ lại bộ nhớ (reallocation), các iterator và con trỏ tới các phần tử cũ có thể bị vô hiệu hóa.
Ví dụ
Chèn một phần tử nguyên tố
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 4};
vec.emplace(vec.begin() + 2, 3); // Chèn số 3 vào vị trí thứ 2
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
Chèn đối tượng phức tạp
#include <iostream>
#include <vector>
#include <string>
struct Student {
std::string name;
int age;
Student(const std::string& n, int a) : name(n), age(a) {}
};
int main() {
std::vector<Student> students;
// Sử dụng emplace() để khởi tạo và chèn trực tiếp
students.emplace(students.end(), "Alice", 20);
students.emplace(students.end(), "Bob", 22);
for (const auto& student : students) {
std::cout << student.name << " - " << student.age << "\n";
}
return 0;
}
Các hàm liên quan
emplace_back | Thêm một phần tử mới vào cuối vector, xây dựng phần tử tại chỗ |
insert | Chèn một hoặc nhiều phần tử vào vị trí chỉ định trong vector |
erase | Xóa một hoặc nhiều phần tử khỏi vector |
assign | Gán giá trị mới cho các phần tử trong vector |