2011-08-10 23 views
6

Genellikle bir vektör geçse de aynı yineleme:Vektörün öğeleri üzerinde yineleme yaparken indeks türü ne olmalıdır?

for (int i = 0; i < myVector.size(); i++) { 
    Element* e = myVector[i]; 
} 

Ama sonra derleyici genellikle bana bu uyarıyı veriyor:

warning: C4018: '<' : signed/unsigned mismatch 

Yani bir int doğru değilse, indeks tipi olmalıdır? vektör :: size() bir "size_type" türünde gibi görünüyor, ancak daha anlamlı bir tür kullanmayı tercih ediyorum. Herhangi bir öneri?

+5

Dizinleri kullanmak yerine yineleyicileri kullanmayı düşünün. –

cevap

13

Sen std::vector<T>::size_type kullanmalıdır. İmzasız integral tipi. Bu genelliklesize_t ile aynıdır.

size_type ve size_t arasındaki farkı bilmek için, bu konuya bakın:

1. Benzer şekilde, std::string::size_type, std::list<T>::size_type, std::deque<T>::size_type, std::set<T>::size_type, vb kullanabilirsiniz. Hemen hemen tüm standart kaplar, size_type olarak adlandırılan yuvalanmış bir türü tanımlar.


biri yineleyici yerine endeksi kullanması gerektiğini iddia edebilir. Ama aynı zamanda bu bazen yineleyici For döngüsü yatay çok geniş, bu bkz yapar bkz: görünmüyor

for(std::vector<std::vector<std::string> >::iterator it = v.begin(); it != v.end(); ++it) 
{ 
} 

. Aslında bazen rahatsız ediyor. Bu gibi durumlarda, bazı programcılar dizini dizinini yineleyici üzerinden tercih ederler.

C++ 0x, yineleyici daha deyimsel hale getirilmiştir. Şimdi hantal sözdizimi yapmadan yineleyici kullanabilirsiniz: kullanarak,

for(auto it = v.begin(); it != v.end(); ++it) 
{ 
} 

Hatta daha da iyisi aralık tabanlı döngü: En int imzalanır çünkü derleyici uyarı verir

for(auto & item : v) 
{ 
} 
2

Ancak size(), size_t türünde imzasız bir int döndürür. Bu tür bir uyumsuzluk istemezsiniz çünkü int negatif ise baş ağrısına neden olabilir. Size_t kullanarak tüm bunları önleyebilirsiniz.

0

Eğer sadece olan yineleme için kullanılıyorsa, o zaman kullanmak isteyebilirsiniz:

typedef std::vector<Element*> ElementContainer; 
    ElementContainer myVector(3); 

    for (ElementContainer::const_iterator cit = myVector.begin();cit != myVector.end(); ++cit) 
    { 
     Element* e = *cit; 
    } 

Bu başka bir kaba vector<> değişen biraz daha sağlam olma avantajına sahiptir.

-1

Sadece unsigned kullanın.size_t ile hangi doğru üstbilginin ekleneceğini asla hatırlamıyorsunuz ve vector<T>::size_type ile çok fazla yazıyorsunuz. Tüm pratik amaçlar için aynı şey, onlar sadece bir düzine kez typedef ed.

+0

Tipik bir 64 bit makinede 'std :: size_t' ve' unsigned' * * aynı şey değildir. –

+0

@David, 64 bit makinede ne farklı olurdu? Size_t' yerine 'imzasız int' kullanırsam herhangi bir soruna girebilir miyim? –

+0

Vektördeki öğelerin sayısı 4294967295'i aşarsa, imzasız int'yi kullanarak sorunla karşılaşırsınız. Uygulamanızın, bu kadar büyük bir vektöre sahip olmanıza bile yaklaşabileceğini düşünüyorsanız, bunu önceden çok iyi bileceksiniz. Çoğu durumda std :: size_t' yerine 'imzasız int' kullanarak herhangi bir sorun yaşamayacaksınız. –

İlgili konular