2012-06-05 22 views
8
std::vector<int> v1(1000); 
std::vector<std::vector<int>> v2(1000); 
std::vector<std::vector<int>::const_iterator> v3(1000); 

Bu 3 vektörün öğeleri nasıl başlatılır?std :: vektör öğeleri

Int hakkında testler yaptım ve tüm öğelerin 0 olduğunu gördüm. Bu standart mı? İlkellerin tanımsız kaldığına inandım. Veri güvenliği için OS belleğinin temizlenmesini önlemek amacıyla 300000000 öğeli bir vektör yaratıyorum, sıfırdan farklı değerler verin, silin ve yeniden oluşturun. Yeniden oluşturulan vektörün elemanları da 0 idi.

Yineleyici nedir? Varsayılan kurucu için başlangıç ​​değeri (0) var mı yoksa başlangıç ​​değeri tanımsız mı? Bunu denetlediğimde yineleyiciler 0'a işaret eder, ancak bu OS

olabilir Kurucuları izlemek için özel bir nesne oluşturduğumda, ilk nesne için vektörün varsayılan kurucuyu çalıştırdığını ve diğerleri için kopya kurucuyu çalıştırdığını gördüm . Bu standart mı?

Öğelerin başlatılmasından tamamen kaçınmanın bir yolu var mı? Yoksa kendi vektörümü yaratmalı mıyım? (Aman Tanrım, her zaman VEKTÖR UYGULAMASI DEĞİLDİR) Paralel işlemle birlikte çok büyük seyrek matrisler kullandığım için soruyorum, bu yüzden push_back() işlevini kullanamıyorum ve elbette yararsız başlatmayı istemiyorum, daha sonra değiştireceğim değer.

cevap

13

, yani varsayılan başlatıldı şunlardır: has

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

documentation aşağıdadır:

Tekrarlanan dizisi yapıcı: vektör başlatır içeriği ile bir tekrar n kez, value kopyalarını ayarlayın. Eğer senin durumunda int olan parametre, T(), varsayılan değerini alır value belirtmediğinden

nedenle tüm unsurları C++ 11 yılında 0

+2

_C++ 11_' in, birer birer varsayılan başlatma yerine bir nüsha basılarak "varsayılan başlangıç ​​değerleri" olarak değiştirildiğine inanıyorum. –

+0

@Attila C++ 11'den alıntılar için cevabımı görün. – pmr

+0

Evet C++ 11 n varsayılan yapılandırıcılar olarak değiştirin. Onaylandı. – Chameleon

3

Bir vektörün öğeleri varsayılan olarak başlatılır; POD türlerinde sıfır başlatılan anlamına gelir. Standart bir vektörle bundan kaçınmanın bir yolu yok.

+1

Varsayılan olarak başlatılmamışlar, değer başlatılıyor. – ildjarn

+0

@ildjarn, Bunu düzelteceğimi biliyordum. Bu başlatma stillerini asla düz tutamam. –

+0

Aynı bölüm benim üzerimde. C++ 'nın semantiği beni zaman zaman kaçıyor, ve ben her gün dili kullanıyorum ... –

5

Varsayılan olarak başlatıldılar.

Int, bunu test ederim ve tüm öğelerin 0 olduğunu gördüm. Bu standart mı? İlkellerin tanımsız kaldığına inandım.

Resim

bir başlatılmamış int bir belirsiz değerine sahiptir. Bunlar Sen ( std::vector<> için) bu kurucu kullanan

int i;   // uninitialized, indeterminate value 
int k = int(); // default initialized, value == 0 
5

olacak Kurucu vector::vector(size_type n) için belirtim, n öğelerinin varsayılan olarak eklendiğini belirtir. Bu, allocator_traits<Allocator>::construct(m, p) (m allocator türünde ve p kapsayıcısında depolanan türe işaret eden) ifadesi tarafından başlatılan bir öğe olarak tanımlanmaktadır. Varsayılan ayırıcı için bu ifade ::new (static_cast<void*>(p)) T()'dur (bkz. 20.6.8.2). Bu değer her bir elemanı başlatır.

İlgili konular