Std :: vector öğesinin başlangıç ​​boyutu nasıl ayarlanır?


130

Bir var vector<CustomClass*>ve vektöre birçok öğe koydum ve hızlı erişime ihtiyacım var, bu yüzden listeyi kullanmıyorum. Vektörün başlangıç ​​boyutu nasıl ayarlanır (örneğin, yeni yerleştirdiğimde kopyalamadan kaçınmak için 20.000 basamak olacak şekilde)?


1
std::vectorİhtiyaçlarınıza daha iyi uyan herhangi bir referansta bunun için bir kurucu ve iki işlev vardır .
chris

1
Kopyalamadan kaçınamazsınız, sadece başlangıç ​​değerini ayarlarsınız.
juanchopanza

1
Kopyalarından kaçının? İşaretçilerin saklanması, kopyalama maliyeti açısından oldukça hafiftir.
user7116


1
@Damir, std::vectorbaşlıkta mı demek istedin ?
Robᵩ

Yanıtlar:


180
std::vector<CustomClass *> whatever(20000);

veya:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

İlki, dizinin gerçek boyutunu belirler - yani, onu 20000 işaretçi vektörü yapar. İkincisi, vektörü boş bırakır, ancak 20000 işaretçi için yer ayırır, böylece yeniden tahsis etmek zorunda kalmadan bu kadarını ekleyebilirsiniz (en fazla).

En azından benim deneyimime göre, bunlardan herhangi birinin performansta büyük bir fark yaratması oldukça sıra dışı - ancak her ikisi de bazı durumlarda doğruluğu etkileyebilir. Özellikle, yeniden tahsis olmadığı sürece, vektördeki yineleyicilerin geçerli kalması garanti edilir ve boyutu / ayrılmış alanı ayarladığınızda, yapmadığınız sürece herhangi bir yeniden tahsis olmayacağından emin olursunuz. t boyutu bunun ötesinde artırın.


Çok sayıda ekleme / silme işlemi için bunlardan hangisi daha verimli olur?
ctor

3
@Loggie: Verimlilikte herhangi bir fark olacağından şüpheliyim. Çoğunlukla onu nasıl kullandığınızı değiştirir - ilki ile, sadece işaretçileri ele alırsınız, yani whatever[10000] = somepointer;ikincisi push_backeklediğiniz her işaretçiye ihtiyaç duyduğu gibi . En azından alışkınsanız vector, ikincisi muhtemelen daha basit ve daha doğaldır.
Jerry Coffin

Kopyalanan kapsayıcının boyutu biliniyorsa, boyutlandırma (yeniden) yapmak ve sonra geri itme yerine kopyalamak neden daha verimli değil?

1
@Cincinnatus: Çünkü reservehafıza boyutunu önceden ayıran bir çağrısı var . Teorik olarak, boyutu ayarlamak hala çok daha hızlı olabilir, çünkü her öğe eklediğinizde geçerli boyutu artırmayı da önler. Gerçekte, bunu ölçebileceğinizden şüpheliyim.
Jerry Tabut

1
aslında, bunu sıcak bir yolda yapıyorsanız ve kod çok adlandırılırsa, çok fazla talimat ve zaman tasarrufu yapabilirsiniz.
bayindirh

15

İlk ayrılan boyutu ayarlamak veya bunu ilk kurucuda yapmak için ayırma işlevini kullanmanız gerekir.

vector<CustomClass *> content(20000);

veya

vector<CustomClass *> content;
...
content.reserve(20000);

Ne zaman reserve()elementler, vector(en azından?) Birçok elemanları için yeterli alan tahsis edecek. Öğeler içinde yoktur vector, ancak bellek kullanıma hazırdır. Bu daha sonra muhtemelen hızlanacaktır push_back()çünkü bellek zaten tahsis edilmiştir.


std::vector<Custom Class*> content(100);
Boyutun

@kstruct: Evet, ancak daha az verimli olabilir - çok küçük bir miktar.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.