参见英文答案 >
Iteration over std::vector: unsigned vs signed index variable16个
我通常以这种方式迭代一个向量:
我通常以这种方式迭代一个向量:
for (int i = 0; i < myVector.size(); i++) { Element* e = myVector[i]; }
但是编译器通常会给我这个警告:
warning: C4018: '<' : signed/unsigned mismatch
因此,如果int不正确,索引应该是哪种类型? vector :: size()似乎是“size_type”类型,但我宁愿使用更有意义的类型.有什么建议吗?
解决方法
你应该使用std :: vector< T> :: size_type1.它的无符号整数类型.它通常与size_t相同.
要了解size_type和size_t之间的区别,请参阅以下主题:
> C++ for-loop – size_type vs. size_t
1.同样,你可以使用std :: string :: size_type,std :: list< T> :: size_type,std :: deque< T> :: size_type,std :: set< T> :: size_type等等上.几乎所有标准容器都定义了一个名为size_type的嵌套类型.
有人可能会说你应该使用迭代器而不是索引.但我也看到有时iterator使for循环水平非常宽,请看:
for(std::vector<std::vector<std::string> >::iterator it = v.begin(); it != v.end(); ++it) { }
它看起来不像.事实上它有时会令人恼火.在这种情况下,一些程序员更喜欢索引而不是迭代器.
在C 0x中,迭代器已经变得更加惯用.现在你可以使用迭代器而不会使语法变得麻烦:
for(auto it = v.begin(); it != v.end(); ++it) { }
甚至更好,使用基于范围的for循环:
for(auto & item : v) { }