: Görünüşe foreach
döngüler hiç listeyi değiştirmek için kullanılmamalıdır
, foreach
döngü aslında üzerinde çalışıyor çünkü orijinal listenin kopyalayın. Bunu değiştirirseniz, sadece örtülü paylaşım ve yazım üzerinde değişiklik nedeniyle bir cezayla uğraşmakla kalmaz, aynı zamanda döngüden çıktıktan sonra değişiklikleriniz de iptal edilir.
Bunu gerçekleştirmenin doğru yolu bir yineleyici kullanmaktır. Java stili yineleyicileri tercih ederim. Basit yineleyiciler sağlayan her liste türü için yineleyici sınıfları olduğunu fark edeceksiniz. QLinkedList
örneği için QMutableLinkedListIterator
sınıfı vardır. Benim yorumlarla Qt documentation itibaren
eklendi:
QMutableLinkedListIterator<int> i(list); // pass list as argument
while (i.hasNext()) {
int val = i.next(); // retrieve value of current item
if (val < 0) {
i.setValue(-val); // change/set value of current item
} else if (val == 0) {
i.remove(); // delete current item
}
}
genel durum için: Aşağıdaki gibi kullanılabilir
diğer bir Qt veri yapısını daha kullanıyorsanız QLinkedList
, şansınız iyi, sizin için bir yineleme sınıfı var. Listeyi değiştirmek isterseniz, Değiştirilebilir sürümünü kullanın. API, bunların her biri için kabaca aynıdır. İşte bu sınıflar:
Structure | Immutable Case | Mutable Case
-----------------------------------------------------
QList | QListIterator | QMutableListIterator
QLinkedList | QLinkedListIterator | QMutableLinkedListIterator
QHash | QHashIterator | QMutableHashIterator
QMap | QMapIterator | QMutableMapIterator
QSet | QSetIterator | QMutableSetIterator
QStringList | QStringListIterator | QMutableStringListIterator
QVector | QVectorIterator | QMutableVectorIterator
@hyde Bu soruyu sorduğum soruya bütünüyle bağladım, sorduğum şeyin tamamını ele almadığını belirttim. QList ve QLinkedList arasında bir fark var. Benzerler, ama * aynı değil. –
Evet, görebildiğim kadarıyla, soruya cevap veriyor. Qt, "foreach" öğesini kullandığınızda kabın sığ bir kopyasını alır. Orijinal kapsayıcı yapısını değiştirirseniz, Qt'nin tüm kapsayıcıya yeni bir derin kopya (yazma anlamında kopya) yapması gerekir. Kısacası, bunun için 'foreach' kullanmayın. Ve semantikler her Qt konteyneri için aynıdır. – hyde