Về mặt thuật toán, việc loại bỏ một tập hợp các phần tử khỏi một mảng liền kề có thể được thực hiện một cách hiệu quả theo hai phần.
- Di chuyển tất cả các phần tử không bị xóa lên đầu mảng.
- Đánh dấu mảng nhỏ hơn.
Điều này có thể được thực hiện trong C++
Điều này được thực hiện bằng cách sử dụng thành ngữ xóa-xóa.
vectơ v // v = {0,1,2,3,0,0,7};
vector::iterator it = Remove(v.begin(),v.end(),e);
// di chuyển tất cả các phần tử không bị xóa lên phía trước
// Vâng, loại bỏ không phải là cái tên sáng giá nhất cho điều đó.
// Đặc biệt là list::remove thực sự loại bỏ các phần tử khỏi danh sách.
// bây giờ v = {1,2,3,7,?,?,?} kết quả được đánh dấu bằng dấu chấm hỏi
// phụ thuộc vào việc thực hiện.
v.erase(it,v.end());
// loại bỏ các phần tử được đánh dấu là dấu chấm hỏi.
// v = {1,2,3,7}
Bây giờ, nội dung của phần tử trong dấu chấm hỏi chưa được biết. Điều duy nhất chúng ta có thể làm với chúng là loại bỏ chúng (bằng cách ghi đè hoặc xóa chúng).
Có nhu cầu sử dụng không remove
Thay vì xóa tình hình thực tế? Tình huống duy nhất tôi có thể nghĩ đến là
sao chép(src.begin(),src.end(),remove(v.begin(),v.end(),e),v.end());
用 B
Thay thế tất cả MỘT
và yêu cầu tất cả những điều mới này B
là liên tục. Không có nhiều ý nghĩa.
biên tập: Ngoại trừ các vùng chứa bộ nhớ liền kề (thực tế deque
Và vectơ
), nó có ý nghĩa gì với điều gì khác không?
Nếu tôi thực sự đúng thì tại sao nó lại được triển khai như một thuật toán độc lập thay vì vectơ::remove_if
,dequeue::remove_if
Chờ đợi.
Câu hỏi của bạn đang đi sai hướng. Thay vào đó, người ta sẽ hỏi "Tại sao tôi nên triển khai cùng một thuật toán này nhiều lần cho mỗi vùng chứa thay vì coi nó như một hàm miễn phí riêng biệt"?
Ý tưởng chính đằng sau việc tách các vùng chứa, trình vòng lặp và thuật toán là sẽ không có sự bùng nổ phức tạp khi bạn viết nhiều thuật toán hơn và nhiều vùng chứa hơn. Nếu bạn muốn viết một vùng chứa mới với bộ lưu trữ liền kề, bạn có thể sử dụng ngay remove
(miễn là bạn cung cấp trình vòng lặp truy cập chuyển tiếp hoặc ngẫu nhiên) mà không cần sao chépbất kì 代码。
Lý do duy nhất khiến một số vùng chứa triển khai thuật toán phiên bản thành viên của riêng chúng là vì chúng có thể thực hiện công việc tốt hơn phiên bản chung (ví dụ: std::set::tìm
so với std::tìm
; hoặc danh sách::xóa
) hoặc vì chúng có thể làm những việc mà phiên bản chung không thể (ví dụ: std::list::sort
Và std::sắp xếp
). Nhưng nếu có thể, bạn nên sử dụng phiên bản miễn phí để có được tính linh hoạt và linh hoạt tối đa.
Tôi là một lập trình viên xuất sắc, rất giỏi!