Bu soru çok fazla oy topladığı ve bir SSS haline geldiği için, C ++ 03 ve C ++ 11 arasında, std::vector
ekleme işleminin etkisi üzerindeki önemli bir farktan bahsetmek için ayrı bir cevap yazmak daha iyi olurdu . göre yineleyiciler ve referansları geçerliliği reserve()
ve capacity()
en upvoted cevap bildirime başarısız.
C ++ 03:
Yeniden konumlandırma, dizideki öğelere atıfta bulunan tüm referansları, işaretçileri ve yineleyicileri geçersiz kılar. Rezerv () çağrısından sonra, bir eklemenin vektörün boyutunu en son rezerv () çağrısında belirtilen boyuttan daha büyük hale getireceği zamana kadar gerçekleşen eklemeler sırasında yeniden tahsis edilmemesi garanti edilir .
C ++ 11:
Yeniden konumlandırma, dizideki öğelere atıfta bulunan tüm referansları, işaretçileri ve yineleyicileri geçersiz kılar. Rezerv () çağrısından sonra, bir eklemenin vektörün boyutunu kapasite () değerinden daha büyük hale getireceği zamana kadar gerçekleşen eklemeler sırasında yeniden tahsis edilmemesi garanti edilir .
Yani C ++ 03'te, unless the new container size is greater than the previous capacity (in which case all iterators and references are invalidated)
diğer cevapta belirtildiği gibi " " değil , bunun yerine " greater than the size specified in the most recent call to reserve()
" olmalıdır . Bu, C ++ 03'ün C ++ 11'den farklı olduğu bir şeydir. C ++ 03'te, bir kez bir insert()
vektör boyutunun önceki reserve()
çağrıda belirtilen değere ulaşmasına neden olur (bu, akım istenenden daha küçük olabilir, capacity()
çünkü istenilenden daha büyük bir reserve()
sonuca neden olabilir capacity()
), sonraki herhangi biri insert()
yeniden tahsise neden olabilir ve geçersiz kılınabilir tüm yineleyiciler ve referanslar. C ++ 11'de bu olmayacak ve her zaman capacity()
, bir sonraki yeniden tahsisin boyut aşılmadan gerçekleşmeyeceğini kesin olarak bilmeye güvenebilirsiniz capacity()
.
Sonuç olarak, bir C ++ 03 vektörü ile çalışıyorsanız ve ekleme işlemi yaparken bir yeniden tahsinin gerçekleşmeyeceğinden emin olmak istiyorsanız, daha önce geçtiğiniz argümanın reserve()
boyutunu değil, çağrının dönüş değeri capacity()
, aksi takdirde kendinizi " erken " yeniden tahsis sürpriz olabilir .