Tôi mới làm quen với Qt và cố gắng tìm hiểu các thành ngữ.Làm cách nào để xóa các phần tử khỏi một Danh sách phát trong khi lặp qua các phần tử đó bằng cách sử dụng foreach?
Các foreach
documentation nói:
Qt tự động chụp một bản sao của container khi nó đi vào một vòng lặp foreach. Nếu bạn sửa đổi vùng chứa khi bạn đang lặp lại, điều đó sẽ không ảnh hưởng đến vòng lặp.
Nhưng nó không nói cách để loại bỏ một yếu tố trong khi lặp lại với foreach
. đoán tốt nhất của tôi là một cái gì đó như:
int idx = 0;
foreach (const Foo &foo, fooList) {
if (bad(foo)) {
fooList.removeAt(idx);
}
++idx;
}
vẻ xấu xí phải phạm vi idx
bên ngoài vòng lặp (và phải duy trì một vòng lặp truy cập riêng biệt ở tất cả).
Ngoài ra, tôi biết rằng Có, deep copy happens.foreach
tạo bản sao QList
, giá rẻ nhưng điều gì sẽ xảy ra khi tôi xóa một phần tử - vẫn rẻ hoặc có bản sao sửa đổi đắt tiền đang diễn ra?
EDIT: Điều này dường như không phải là Qt thành ngữ.
for (int idx = 0; idx < fooList.size();) {
const Foo &foo = fooList[idx];
if (bad(foo)) {
fooList.removeAt(idx);
}
else ++idx;
}
Tại sao bạn muốn sử dụng 'foreach 'vì điều này? – Mat
@Mat, tôi không phải sử dụng 'foreach', nó có vẻ tốt đẹp để sử dụng, và các tài liệu dường như đề nghị có một số cách để làm điều đó. Qt dường như đã suy nghĩ rất tốt, tôi đã tìm ra một số thành ngữ rõ ràng cho những gì tôi đang cố gắng làm. – Dan
Điều gì về void QMutableListIterator :: remove()? http://developer.qt.nokia.com/doc/qt-4.8/qmutablelistiterator.html#remove –