std::list::erase
#include <list>
// Phiên bản 1: Xóa một phần tử tại vị trí được chỉ định
iterator erase(const_iterator pos);
// Phiên bản 2: Xóa các phần tử trong một phạm vi
iterator erase(const_iterator first, const_iterator last);
Xóa một hoặc nhiều phần tử khỏi std::list tại một vị trí cụ thể hoặc trong một phạm vi.
Tham số
pos
- Iterator trỏ đến phần tử cần xóa (phiên bản 1).
pos
phải là một iterator hợp lệ và có thể dereference được trong std::list.
first, last
- Iterator xác định phạm vi các phần tử cần xóa (phiên bản 2).
first
trỏ đến phần tử đầu tiên cần xóa,last
trỏ đến phần tử sau phần tử cuối cùng cần xóa (past-the-end).
Giá trị trả về
- Trả về một iterator trỏ đến phần tử theo sau phần tử cuối cùng bị xóa. Nếu không có phần tử nào như vậy (ví dụ: xóa phần tử cuối cùng của std::list), hàm trả về
end()
.
Đặc điểm
- Xóa phần tử tại vị trí cụ thể hoặc trong phạm vi:
erase()
cho phép bạn xóa một phần tử duy nhất hoặc một dãy các phần tử liên tiếp. - Giảm kích thước:
erase()
làm giảm kích thước của std::list tương ứng với số lượng phần tử bị xóa. - Hành vi không xác định khi iterator không hợp lệ: Gọi
erase()
với iterator không hợp lệ (ví dụ:pos
trỏ đếnend()
, hoặcfirst
,last
không hợp lệ) 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 std::list có thể làm thay đổi (invalidate) các iterator đang trỏ đến các phần tử trong std::list, ngoại trừ iterator được trả về bởi hàm
erase()
(nó trỏ đến phần tử ngay sau phần tử cuối cùng bị xóa). - Không trả về giá trị phần tử bị xóa:
erase()
không trả về giá trị của phần tử bị xóa. - An toàn exception: Nếu exception xảy ra trong khi destructor của
value_type
đang chạy, các thay đổi củaerase()
vẫn có hiệu lực (số phần tử cần xóa đã được xóa). - Độ phức tạp:
- Xóa một phần tử:
O(1)
. - Xóa nhiều phần tử: Độ phức tạp tuyến tính theo số lượng phần tử bị xóa -
O(n)
.
- Xóa một phần tử:
Ví dụ
#include <iostream>
#include <list>
int main() {
std::list<int> mylist = {10, 20, 30, 40, 50, 60};
// Phiên bản 1: Xóa phần tử thứ ba (có giá trị 30)
auto it = mylist.begin();
std::advance(it, 2);
mylist.erase(it);
std::cout << "mylist after erase(it):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after erase(it): 10 20 40 50 60
std::cout << '\n';
// Phiên bản 2: Xóa hai phần tử đầu tiên
mylist.erase(mylist.begin(), ++++mylist.begin());
std::cout << "mylist after erase(mylist.begin(), ++++mylist.begin()):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after erase(mylist.begin(), ++++mylist.begin()): 40 50 60
std::cout << '\n';
// Phiên bản 2: Xóa phần tử cuối cùng
it = mylist.end();
--it;
mylist.erase(it, mylist.end());
std::cout << "mylist after erase(it, mylist.end()):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after erase(it, mylist.end()): 40 50
std::cout << '\n';
return 0;
}
Các hàm liên quan
pop_back | Xóa phần tử cuối cùng của std::list |
pop_front | Xóa phần tử đầu tiên của std::list |
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 std::list |
unique | Xóa các phần tử trùng lặp liên tiếp khỏi std::list |
insert | Chèn một hoặc nhiều phần tử mới vào một vị trí cụ thể trong std::list |