迭代向量的元素时,索引类型应该是什么?

lau*_*ent 10 c++ indexing types loops stdvector

我通常以这种方式迭代一个向量:

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

但是编译器通常会给我这个警告:

warning: C4018: '<' : signed/unsigned mismatch
Run Code Online (Sandbox Code Playgroud)

所以,如果a int不正确,索引应该是哪种类型?vector :: size()似乎是"size_type"类型,但我宁愿使用更有意义的类型.有什么建议吗?

Naw*_*waz 14

你应该使用std::vector<T>::size_type1.它的无符号整数类型.它通常与...相同size_t.

要知道之间的区别size_typesize_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)
{
}
Run Code Online (Sandbox Code Playgroud)

它不看.事实上它有时会令人恼火.在这种情况下,一些程序员更喜欢索引而不是迭代器.

在C++ 0x中,迭代器已经变得更加惯用了.现在你可以使用迭代器而不会使语法繁琐:

for(auto it = v.begin(); it != v.end(); ++it)
{  
}
Run Code Online (Sandbox Code Playgroud)

甚至更好,使用基于范围的 for循环:

for(auto & item : v)
{
}
Run Code Online (Sandbox Code Playgroud)