我通常以这样的方式迭代一个向量:
for (int i = 0; i < myVector.size(); i++) {
Element* e = myVector[i];
}
但是编译器通常会给我这个警告:
warning: C4018: '<' : signed/unsigned mismatch
因此,如果int
不正确,那么索引应该是哪种类型? vector :: size()似乎是“size_type”类型,但我宁愿使用更有意义的类型。有什么建议吗?
答案 0 :(得分:14)
您应该使用std::vector<T>::size_type
1 。它的无符号整数类型。它的通常与size_t
相同。
要了解size_type
和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 而不是 index 。但我也看到,有时迭代器使for循环水平非常宽,请看:
for(std::vector<std::vector<std::string> >::iterator it = v.begin(); it != v.end(); ++it)
{
}
它不看。事实上它有时会令人恼火。在这种情况下,一些程序员喜欢索引而非迭代器。
在C ++ 0x中, iterator 更加惯用。现在你可以使用 iterator 而不会使语法变得麻烦:
for(auto it = v.begin(); it != v.end(); ++it)
{
}
甚至更好,使用基于范围的 for loop:
for(auto & item : v)
{
}
答案 1 :(得分:2)
编译器发出警告,因为你的int是有符号的,但是size()返回一个size_t类型的unsigned int。你不希望这种不匹配,因为如果你的int是负数,它会引起头痛。您可以使用size_t来避免所有这些。
答案 2 :(得分:0)
如果你只是使用它进行迭代,那么你可能想要使用:
typedef std::vector<Element*> ElementContainer;
ElementContainer myVector(3);
for (ElementContainer::const_iterator cit = myVector.begin();cit != myVector.end(); ++cit)
{
Element* e = *cit;
}
这样做的好处是可以从vector<>
更改为另一个容器。
答案 3 :(得分:-1)
只需使用unsigned
即可。使用size_t
,您永远不会记住要包含的正确标头是什么,而vector<T>::size_type
最终会输入太多内容。出于所有实际目的,它们是相同的,只需重新typedef
十几次。