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

std::forward_list::emplace_front

#include <forward_list>

template <class... Args>
void emplace_front(Args&&... args);

Xây dựng một phần tử mới trực tiếp tại đầu forward_list, tránh việc sao chép hoặc di chuyển không cần thiết.

Tham số

args

  • Danh sách các đối số (có thể trống) được sử dụng để khởi tạo phần tử mới. Các đối số này sẽ được truyền đến constructor của kiểu phần tử value_type của forward_list.

Giá trị trả về

Không có giá trị trả về

Đặc điểm

  1. Xây dựng phần tử tại chỗ (In-place construction): emplace_front() tạo phần tử mới trực tiếp trong bộ nhớ của forward_list tại vị trí đầu tiên, tránh việc tạo ra các đối tượng tạm thời không cần thiết, tối ưu hiệu suất.
  2. Tránh sao chép và di chuyển: Bằng cách xây dựng phần tử tại chỗ, emplace_front() giúp tránh việc sao chép (copy) hoặc di chuyển (move) các đối tượng, đặc biệt hiệu quả khi làm việc với các đối tượng lớn hoặc phức tạp.
  3. Hỗ trợ variadic template: emplace_front() sử dụng variadic template (Args&&... args), cho phép nó nhận số lượng đối số tùy ý, phù hợp với constructor của kiểu phần tử.
  4. Không làm thay đổi vị trí tương đối của các phần tử đã tồn tại: Khi chèn phần tử mới vào đầu forward_list bằng emplace_front(), các phần tử đã tồn tại trong forward_list sẽ được dời về phía sau, nhưng thứ tự tương đối giữa chúng vẫn được giữ nguyên.
  5. Phân biệt với push_front(): push_front() sẽ tạo bản sao hoặc di chuyển phần tử được truyền vào trong khi đó emplace_front() sẽ xây dựng phần tử tại chỗ trong forward_list, cho phép dùng emplace_front() ngay cả khi kiểu phần tử không hỗ trợ copy/move constructor.
  6. Độ phức tạp: Độ phức tạp của emplace_front()O(1) - thời gian hằng số, giống như push_front().

Ví dụ

#include <iostream>
#include <forward_list>

class NonCopyable {
public:
NonCopyable(int val) : data(val) {}
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;

// Move constructor/assignment are not necessary but good practice
NonCopyable(NonCopyable&&) = default;
NonCopyable& operator=(NonCopyable&&) = default;

int data;
};

int main() {
std::forward_list<NonCopyable> mylist;

// mylist.push_front(NonCopyable(10)); // Error: Copy constructor is deleted

mylist.emplace_front(10); // OK: Constructs the element in-place
mylist.emplace_front(20); // OK: Constructs the element in-place

std::cout << "mylist:";
for (const auto& obj : mylist) {
std::cout << " " << obj.data;
}
std::cout << '\n'; // Output: mylist: 20 10

return 0;
}

Các hàm liên quan

emplace_afterXây dựng một phần tử mới trực tiếp vào vị trí sau một iterator cho trước trong forward_list
push_frontThêm một phần tử mới vào đầu forward_list
pop_frontXóa phần tử đầu tiên của forward_list