Nếu ví dụ bạn có một std::vector<MyClass>
, trong đó MyClass
có phương pháp công khai: bool isTiredOfLife()
, làm thế nào để bạn loại bỏ các yếu tố trả về true?Bạn sẽ loại bỏ các phần tử của std :: vector dựa trên một số thuộc tính của các phần tử như thế nào?
Bạn sẽ loại bỏ các phần tử của std :: vector dựa trên một số thuộc tính của các phần tử như thế nào?
Trả lời
tôi thích remove_if
v.erase(remove_if(v.begin(), v.end(),
mem_fun_ref(&MyClass::isTiredOfLife)),
v.end());
remove_if
trả về một iterator trỏ sau khi yếu tố cuối cùng đó là vẫn còn trong chuỗi. erase
xóa mọi thứ từ đầu tiên đến đối số cuối cùng của nó (cả hai vòng lặp).
Sử dụng remove_if là cách "đúng" để thực hiện việc này. Cẩn thận KHÔNG sử dụng một trình lặp để chu kỳ và xóa, vì việc loại bỏ các mục làm mất hiệu lực trình lặp. Trong thực tế, bất kỳ ví dụ nào sử dụng phương thức xóa() làm phương thức chính của nó là một ý tưởng tồi trên vectơ, bởi vì xóa là O (n), nó sẽ làm cho thuật toán của bạn O (n^2). Đây phải là một thuật toán O (n).
Phương pháp tôi đưa ra bên dưới có thể nhanh hơn remove_if nhưng không giống như remove_if, sẽ KHÔNG giữ nguyên thứ tự tương đối của các phần tử. Nếu bạn quan tâm đến việc duy trì trật tự (ví dụ: vectơ của bạn được sắp xếp), hãy sử dụng remove_if, như trong câu trả lời ở trên. Nếu bạn không quan tâm đến trật tự và nếu số lượng mục cần xóa thường ít hơn một phần tư của vectơ, thì phương pháp này có thể nhanh hơn:
for(size_t i = 0; i < vec.size();)
if(vec[i].isTiredOfLife())
{
vec[i] = vec.back();
vec.pop_back();
}
else
++i;
D'oh. Tôi quên mất điều đó. Nó thậm chí còn in đậm trong trang tôi đã liên kết. : o Tôi đã xóa bài đăng của mình, vì vậy không ai sử dụng nó. – Bernard
Sẽ không sắp xếp lại các phần tử trong vectơ? Giả sử rằng, ví dụ, vector đầu vào được sắp xếp, vector đầu ra sẽ không, phần tử cuối cùng sẽ lấy vị trí của phần tử đã xóa đầu tiên. –
Bạn có thể muốn cập nhật câu trả lời của mình để không đề cập đến Bernard nữa. –
- 1. Tìm phần tử cụ thể dựa trên một thuộc tính
- 2. Xóa các phần tử khỏi một vector
- 3. Loại phần tử của các phần tử giả là gì?
- 4. R: loại bỏ các phần tử cuối cùng của một vector
- 5. Lược đồ JSON: Phần tử hợp lệ dựa trên giá trị của một phần tử khác
- 6. C++ cho mỗi phần, kéo từ các phần tử vector
- 7. Tham chiếu Const trong std :: các phần tử vector
- 8. ElementTree XPath - Chọn phần tử dựa trên thuộc tính
- 9. D3: Loại bỏ các phần tử
- 10. Thêm các phần tử vào một vector trong vòng lặp dựa trên dải C++ 11
- 11. Cách hiệu quả nhất để phát hiện và loại bỏ các phần tử trong mảng dựa trên giá trị đầu tiên và cuối cùng của các phần tử
- 12. Bạn có thể thêm thuộc tính của riêng mình vào các phần tử HTML không?
- 13. Thêm các phần tử của một mảng
- 14. Căn chỉnh byte của các phần tử trong std :: vector <char> là gì?
- 15. Gọi hàm trên mọi phần tử của vector C++
- 16. Thuộc tính `complete` của phần tử hình ảnh hoạt động như thế nào?
- 17. Cách thay thế các phần tử trong mảng bằng các phần tử của mảng khác
- 18. Làm thế nào để có được các phần tử n đầu tiên của một std :: map
- 19. Đếm số phần tử với các giá trị của x trong một vector
- 20. javascript - loại bỏ phần tử mảng trên điều kiện
- 21. Chọn các phần tử m một cách ngẫu nhiên từ một vector chứa các phần tử n
- 22. Xoay phần tử dựa trên vị trí con trỏ trong một phần tử riêng biệt
- 23. Thuộc tính Loại trên các phần tử SCRIPT, STYLE và LINK có cần thiết không?
- 24. Làm cách nào để sắp xếp vectơ các cặp dựa trên phần tử thứ hai của cặp?
- 25. Tạo một kích thước cố định std :: vector và ghi vào các phần tử
- 26. tìm các phần tử có vị trí: thuộc tính
- 27. Các loại và phần tử liên kết
- 28. Thay đổi tên thuộc tính của phần tử trong các hình thức hấp dẫn
- 29. Các loại phần tử vùng chứa
- 30. Lặp lại mảng khi loại bỏ các phần tử
Tôi quên về remove_if() +1 . –
Rất hay. Chưa bao giờ thấy điều đó trước đây. +1 – Bernard
Cảm ơn, điều đó đã xảy ra. –