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

时间:2011-08-10 06:27:26

标签: c++ loops types indexing stdvector

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

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

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

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

因此,如果int不正确,那么索引应该是哪种类型? vector :: size()似乎是“size_type”类型,但我宁愿使用更有意义的类型。有什么建议吗?

4 个答案:

答案 0 :(得分:14)

您应该使用std::vector<T>::size_type 1 。它的无符号整数类型。它的通常size_t相同。

要了解size_typesize_t之间的区别,请参阅此主题:

1。同样,您可以使用std::string::size_typestd::list<T>::size_typestd::deque<T>::size_typestd::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十几次。