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

std::forward_list::erase_after

#include <forward_list>

iterator erase_after(const_iterator pos);

iterator erase_after(const_iterator pos, const_iterator last);

Xóa một hoặc nhiều phần tử khỏi forward_list tại vị trí sau một iterator cho trước.

Tham số

pos

  • const_iterator trỏ đến vị trí mà sau đó các phần tử sẽ bị xóa.
  • pos phải là một iterator hợp lệ trong forward_list, bao gồm cả giá trị trả về bởi before_begin() (để xóa phần tử đầu tiên).

last

  • const_iterator xác định phạm vi kết thúc của các phần tử cần xóa.
  • last phải là một iterator hợp lệ trong forward_list. Phạm vi xóa là (pos, last).

Giá trị trả về

  • Phiên bản 1: Trả về một iterator trỏ đến phần tử theo sau phần tử bị xóa trong forward_list. Nếu pos trỏ đến phần tử trước phần tử cuối cùng, hàm trả về end().
  • Phiên bản 2: Trả về iterator last.

Đặc điểm

  1. Xóa sau vị trí đã cho: erase_after() luôn xóa các phần tử sau vị trí được trỏ bởi iterator pos.
  2. Giảm kích thước: erase_after() làm giảm kích thước của forward_list tương ứng với số lượng phần tử bị xóa.
  3. Hành vi không xác định khi forward_list rỗng hoặc iterator không hợp lệ: Gọi erase_after() với pos trỏ đến end() hoặc không phải là iterator hợp lệ của forward_list sẽ dẫn đến hành vi không xác định.
  4. Có thể làm thay đổi iterator: Việc xóa phần tử khỏi forward_list có thể làm thay đổi (invalidate) các iterator đang trỏ đến các phần tử phía sau vị trí xóa. Iterator pos và iterator trỏ đến các phần tử trước vị trí xóa vẫn hợp lệ.
  5. Trường hợp pos không hợp lệ: Nếu pos không hợp lệ (ví dụ: không trỏ đến forward_list hiện tại), hành vi là không xác định.
  6. Không trả về giá trị phần tử bị xóa: erase_after() không trả về giá trị của phần tử bị xóa.
  7. Độ phức tạp:
    • Xóa một phần tử (phiên bản 1): O(1).
    • Xóa nhiều phần tử (phiên bản 2): Độ phức tạp tuyến tính theo số lượng phần tử bị xóa - O(n) với n là số phần tử bị xóa.

Ví dụ

#include <iostream>
#include <forward_list>

int main() {
std::forward_list<int> mylist = {10, 20, 30, 40, 50, 60};

// Phiên bản 1: Xóa phần tử sau phần tử đầu tiên (xóa 20)
auto it = mylist.begin();
mylist.erase_after(it);
std::cout << "mylist after erase_after(it):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after erase_after(it): 10 30 40 50 60
std::cout << '\n';

// Phiên bản 2: Xóa các phần tử từ sau phần tử đầu tiên đến trước phần tử cuối cùng (xóa 30, 40, 50)
mylist.erase_after(mylist.begin(), mylist.end());
std::cout << "mylist after erase_after(mylist.begin(), mylist.end()):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after erase_after(mylist.begin(), mylist.end()): 10 60
std::cout << '\n';

// Phiên bản 1: Xóa phần tử đầu tiên (sử dụng before_begin())
mylist.erase_after(mylist.before_begin());
std::cout << "mylist after erase_after(mylist.before_begin()):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after erase_after(mylist.before_begin()): 60
std::cout << '\n';

return 0;
}

Các hàm liên quan

removeXóa tất cả các phần tử có giá trị bằng với một giá trị cho trước khỏi forward_list
uniqueXóa các phần tử trùng lặp liên tiếp khỏi forward_list
splice_afterChuyển (transfer) các phần tử từ một forward_list khác hoặc từ một phạm vi trong forward_list khác sang forward_list hiện tại
insert_afterChèn một hoặc nhiều phần tử mới vào sau một vị trí iterator cho trước trong forward_list
pop_frontXóa phần tử đầu tiên của forward_list