Có hai cách để bạn có thể sử dụng để xóa một mục cụ thể. hãy lấy một vectơ
std :: vector < int > v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(40);
v.push_back(50);
1) Cách không hiệu quả: Mặc dù có vẻ khá hiệu quả nhưng không phải vì chức năng xóa sẽ xóa các phần tử và dịch chuyển tất cả các phần tử sang trái 1.
vì vậy độ phức tạp của nó sẽ là O (n ^ 2)
std :: vector < int > :: iterator itr = v.begin();
int value = 40;
while ( itr != v.end() )
{
if(*itr == value)
{
v.erase(itr);
}
else
++itr;
}
2) Cách hiệu quả (KHUYẾN NGHỊ) : Nó còn được gọi là XÓA - XÓA các thành ngữ .
- std :: remove biến đổi phạm vi đã cho thành một phạm vi với tất cả các phần tử so sánh không bằng với phần tử đã cho được chuyển sang phần đầu của container.
- Vì vậy, thực sự không loại bỏ các yếu tố phù hợp. Nó chỉ chuyển cái không khớp sang bắt đầu và đưa ra một trình vòng lặp đến kết thúc hợp lệ mới. Nó chỉ đòi hỏi độ phức tạp O (n).
đầu ra của thuật toán loại bỏ là:
10 20 30 50 40 50
như kiểu trả về của remove là iterator đến phần cuối mới của phạm vi đó.
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Bây giờ sử dụng chức năng xóa của vectơ để xóa các phần tử từ đầu mới đến đầu cũ của vectơ. Nó đòi hỏi O (1) thời gian.
v.erase ( std :: remove (v.begin() , v.end() , element ) , v.end () );
vì vậy phương pháp này hoạt động trong O (n)