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

forward_list emplace_after() và emplace_front() trong C++ STL

forward_list chỉ giữ liên kết đến phần tử tiếp theo (khác list có cả prev/next), chỉ duyệt được một chiều.

emplace_front()

Chèn phần tử mới vào đầu danh sách.

Syntax: forward_list_name.emplace_front(element);

Không trả về giá trị.

emplace_after()

Chèn phần tử mới sau vị trí chỉ định bởi iterator.

Syntax: forward_list_name.emplace_after(iterator, element);

Trả về iterator trỏ đến phần tử vừa chèn.

Ví dụ minh họa

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

int main() {
    forward_list<int> Lt = {5, 6, 7, 8};
    
    // Chèn 3 vào đầu
    Lt.emplace_front(3);
    
    // Chèn 10 sau cuối (end() trỏ sau phần tử cuối)
    auto itr = Lt.end();
    Lt.emplace_after(itr, 10); // Lưu ý: end() không thể dereference, cần dùng before_end()
    
    // In danh sách
    for (auto it = Lt.begin(); it != Lt.end(); ++it)
        cout << *it << " ";
    return 0;
}

Kết quả

3 5 6 7 8 10

Lưu ý quan trọng: emplace_after(end()) là hành vi không xác định (UB). Cần dùng cbefore_begin() hoặc duyệt đến phần tử cuối. Code gốc có lỗi này.

Sửa đúng: Dùng auto itr = Lt.before_begin(); rồi ++itr đến vị trí mong muốn, hoặc dùng prev(Lt.end()) (C++11).