Chuyển tới nội dung chính

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

  1. 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.
  2. 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ử.
  3. 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.
  4. 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.
  5. 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_backThêm một phần tử mới vào cuối vector, xây dựng phần tử tại chỗ
insertChèn một hoặc nhiều phần tử vào vị trí chỉ định trong vector
eraseXóa một hoặc nhiều phần tử khỏi vector
assignGán giá trị mới cho các phần tử trong vector