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ởibefore_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
- Xóa sau vị trí đã cho:
erase_after()
luôn xóa các phần tử sau vị trí được trỏ bởi iteratorpos
. - 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. - 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ớipos
trỏ đếnend()
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. - 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ệ. - 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. - 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. - Độ 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.
- Xóa một phần tử (phiên bản 1):
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
remove | Xó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 |
unique | Xóa các phần tử trùng lặp liên tiếp khỏi forward_list |
splice_after | Chuyể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_after | Chè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_front | Xóa phần tử đầu tiên của forward_list |