2010-12-10 17 views
6

Bazı eski c kodlarını C++ içine yüklüyorum ve bir dizide uygulanan bağlantılı bir listeyle karşılaşıyorum. Öğe, basit bir yapıdır: dizini biliyorsanız, bir dizide, veriye hızlı erişim vardır. Bağlantılı liste yönü, öğelerin etrafında hareket etmesini ve listeden "silinmesini" sağlar. Öğeler, kullanım sıklığına (MRU için ve LRU için aşağı) göre listede taşınabilir.Nasıl uygulanacağı hakkında düşünceler?

Bunu uygulamak için başka bir dizi kullanmanın daha iyi bir yolunu bulmak istiyorum. STL'yi kullanmak isterdim, fakat hangi konteynerin en iyi kullanılacağından emin değilim.

Herhangi birinin bir fikri var mı?

+0

Rastgele erişim hızı çok önemli mi? Yani, yinelemenin aksine * çok * oluyor mu? – Guy

+0

Tamamen kodun geri kalanı tarafından nasıl kullanıldığına bağlıdır. Doğrudan erişim, öğelere erişmenin yaygın bir yoludur veya çoğunlukla listeye adım atılarak yapılır mı? Bazı elemanlar diğerlerine göre daha sık erişiliyor mu? – suszterpatt

+3

Bir keresinde konteynırın ortasından öğeler eklerken/kaldırıyor olsanız bile, std :: vector'nın std :: list'den neredeyse her zaman daha iyi bir seçim olduğunu iddia eden bir makaleyi okudum (ve savundum) . Makaleyi şimdi bulamıyorum, bu yüzden bunu bir yanıt yerine yorum olarak ekledim. Makaleden haberdar olan başka bir kişinin bir bağlantı yayınlayabilmesi için minnettar olurum. –

cevap

10

bu bir bağlantılı liste olduğundan, muhtemelen std::list kullanmalıdır ...

başparmak kuralı listedeki rastgele konumlara unsurları eklemek gerektiğinde Bağlantılı bir listesini kullanmak istediğiniz veya olması rastgele öğeleri listeden sil. Temel olarak listenin sonuna/sonuna öğelerin eklenmesi/silinmesi gerekiyorsa, std::vector'u kullanmalısınız. Başlangıç ​​veya listenin sonuna/öğesine öğelerin eklenmesi/silinmesi gerekiyorsa, std::deque'u kullanmalısınız.

Unutmayın, burada olasılıklardan bahsediyoruz. Mavi bir ayda bir std::vector'un ortasına bir eleman eklemeniz gerekiyorsa, bu muhtemelen tamam olacaktır. Ancak bunu her zaman yapmanız gerekiyorsa, performans üzerinde büyük bir etkisi olacaktır, çünkü vektörün elemanlarını sürekli hareket ettirmesi ve muhtemelen belleğini yeniden tahsis etmesi gerekecektir.

Diğer taraftan, bir vektörün kullanılmasının avantajı, öğelerinin bellekte bitişik olmasıdır; bu, önbelleğe alma nedeniyle sırayla bunları kolayca geçirmeniz gerektiğinde performansı büyük ölçüde artırır.

+0

Doğrudan erişim en yaygın erişimdir – kberson

+2

@kberson nb. Bu std :: listesi dizine göre doğrudan erişimi desteklemiyor. – razlebe

+0

Öğelere yalnızca dizinle doğrudan erişebilmeniz gerekir. Öğeleri taşıyabilmeniz gerekiyor, yani stl :: vektör çalışmıyor. – kberson

4

Bu listedeki veriler işaretçiler olduğundan, neden bağlantılı bir listeyle uğraşmak istesin? Küçük POD'lar için, std::vector genellikle en iyi ilk bahistir ve verilerinin işlemci önbellekleriyle birlikte daha iyi bir şekilde oynaması nedeniyle, teoride, bağlantılı bir listenin daha iyi olması gereken yerlerde bile, genellikle bağlantılı bir liste çıkarır. Bazı profiller performans sorunu olduğunu ve std::list'un daha iyi performans göstermesini bekleyene kadar std::vector seçerim.

İlgili konular