Man sollte sie reparieren, nicht unterdrücken. Verwenden Sie einen Typ ohne Vorzeichen:
for (size_t i = 0; i < blahs.size(); ++i)
Sie können auch Folgendes verwenden unsigned
aber size_t
ist hier besser geeignet (und hat möglicherweise eine andere, größere Reichweite). Wenn Sie nur i
zu iterieren und seinen Wert nicht in der Schleife zu benötigen, verwenden Sie stattdessen Iteratoren:
for (auto iter = blahs.begin(), end = blahs.end(); iter != end; ++iter)
Wenn Ihr Compiler keine Unterstützung für auto
ersetzen auto
avec T::iterator
ou T::const_iterator
, donde T
ist der Typ von blahs
. Wenn Ihr Compiler jedoch eine umfassendere Teilmenge von C++11 unterstützt, tun Sie dies:
for (auto& element : blahs)
Das ist das Beste von allem.
Streng genommen ist die obige Formulierung nicht "korrekt". Sie sollte lauten:
typedef std::vector<Blah> blah_vec;
blah_vec blahs;
for (blah_vec::size_type i = 0; i < blahs.size(); ++i)
Aber das kann langatmig sein, und jede mir bekannte Implementierung verwendet size_t
como size_type
sowieso.
Wenn Sie aus irgendeinem Grund wirklich einen vorzeichenbehafteten Integer-Typ für i
müssen Sie werfen:
// assumes size() will fit in an int
for (int i = 0; i < static_cast<int>(blahs.size()); ++i)
// assumes i will not be negative (so use an unsigned type!)
for (int i = 0; static_cast<size_t>(i) < blahs.size(); ++i)
// and the technically correct way, assuming i will not be negative
for (int i = 0; static_cast<blah_vec::size_type>(i) < blahs.size(); ++i)