Chỉnh sửa: Tài liệu cho std::remove
đã được sửa chữa vì câu trả lời này đã được viết. Điều tương tự áp dụng cho list::remove
.
Hãy để tôi cho bạn một ví dụ để cho bạn thấy làm thế nào cpluscplus.com có thể hiểu sai.
Xem xét std::remove
chức năng từ <algorithm>
.
Thực tế là std::remove
không loại bỏ các mục từ container. Đó là bởi vì nó chỉ std::remove
hoạt động với một cặp vòng lặp và không biết gì về container thực sự chứa các vật phẩm. Trong thực tế, không thể std::remove
biết được container bên dưới, bởi vì không có cách nào nó có thể đi từ một cặp trình vòng lặp để khám phá về container mà trình lặp đó thuộc về. Vì vậy, std::remove
không thực sự loại bỏ các mặt hàng, đơn giản là vì nó không thể . Cách duy nhất để thực sự loại bỏ một mục khỏi một container là gọi một hàm thành viên trên container đó.
Vì vậy, nếu bạn muốn xóa các mục, hãy sử dụng Xóa thành ngữ :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Nhưng cplusplus.com
cung cấp thông tin không chính xác về std::remove
. Nó nói rằng
Lưu ý rằng chức năng này không làm thay đổi các thành phần qua đầu mới, giữ các giá trị cũ của chúng và vẫn có thể truy cập được .
Điều đó không đúng. Trình lặp trong phạm vi [new_end, old_end)
vẫn có thể điều chỉnh được, nhưng điều đó KHÔNG có nghĩa là chúng giữ các giá trị cũ và vẫn có thể truy cập được. Chúng không được chỉ định.
Tương tự, cplusplus.com
cung cấp thông tin không chính xáclist::remove
là tốt. Nó nói ,
Lưu ý rằng một hàm thuật toán toàn cầu, loại bỏ, tồn tại với một hành vi tương tự nhưng hoạt động giữa hai lần lặp.
Điều đó là hoàn toàn sai. Loại bỏ toàn cầu cụ thể std::remove
là không giống với list::remove
, như chúng ta đã thấy rằng cái trước KHÔNG thực sự loại bỏ các mục khỏi container vì nó không thể , trong khi cái sau (chức năng thành viên) thực sự loại bỏ các mục vì nó có thể .
Câu trả lời này được sao chép từ một câu trả lời khác của tôi trong chủ đề sau, với một chút sửa đổi:
Lưu ý: Vì tôi đã bắt gặp điều này gần đây khi tôi trả lời trong chủ đề trên, tôi nhớ nó. Có rất nhiều lỗi mà tôi đã gặp trong hai năm qua, mà tôi không nhớ. Tôi có thể thêm vài lần sau, nếu tôi gặp lại.