C++ 迭代向量元素时,索引类型应该是什么?
我通常以这种方式迭代向量:C++ 迭代向量元素时,索引类型应该是什么?,c++,loops,types,indexing,stdvector,C++,Loops,Types,Indexing,Stdvector,我通常以这种方式迭代向量: for (int i = 0; i < myVector.size(); i++) { Element* e = myVector[i]; } for(int i=0;i TyPulfED十几次。而不是使用索引,考虑使用迭代器。在一个典型的64位机器上, STD::SiZeZt和未签名< /代码>不是同一件事。“戴维,64位机器上有什么不同?如果我使用unsigned int而不是size\u t,是否会遇到任何问题?如果向量中的项数超过4294967
for (int i = 0; i < myVector.size(); i++) {
Element* e = myVector[i];
}
for(int i=0;i
但编译器通常会给我以下警告:
warning: C4018: '<' : signed/unsigned mismatch
警告:C4018:“您应该使用std::vector::size\u type
1。它的无符号整数类型。它通常与大小\u t
相同
要了解size\u type
和size\u t
之间的区别,请参阅本主题:
一,。类似地,您可以使用std::string::size\u type
,std::list::size\u type
,std::deque::size\u type
,std::set::size\u type
,等等。几乎所有标准容器都定义了一个嵌套类型,称为size\u type
有人可能认为应该使用迭代器而不是索引。但我也看到迭代器有时会使for循环在水平方向上非常宽,请参见:
for(std::vector<std::vector<std::string> >::iterator it = v.begin(); it != v.end(); ++it)
{
}
或者更好,使用基于范围的for循环:
for(auto & item : v)
{
}
编译器发出警告,因为您的int是有符号的,但size()返回类型为size\t的无符号int。您不希望出现这种不匹配,因为如果int为负数,可能会导致麻烦。您可以通过使用size\u t来避免所有这些问题。如果您只是将其用于迭代,那么您可能需要使用:
typedef std::vector<Element*> ElementContainer;
ElementContainer myVector(3);
for (ElementContainer::const_iterator cit = myVector.begin();cit != myVector.end(); ++cit)
{
Element* e = *cit;
}
typedef std::vector ElementContainer;
元素容器myVector(3);
对于(ElementContainer::const_迭代器cit=myVector.begin();cit!=myVector.end();++cit)
{
元素*e=*cit;
}
这样做的好处是,从向量
更改到另一个容器时,会稍微稳健一些。只需使用无符号
。使用size\u t
时,您永远不会记得要包含的正确标题是什么,而使用vector::size\u type
时,您会输入太多。对于所有的实际用途,它们都是一样的东西,只是重新编写代码> TyPulfED十几次。而不是使用索引,考虑使用迭代器。在一个典型的64位机器上,<代码> STD::SiZeZt和<代码>未签名< /代码>不是同一件事。“戴维,64位机器上有什么不同?如果我使用unsigned int
而不是size\u t
,是否会遇到任何问题?如果向量中的项数超过4294967295,则使用unsigned int
会遇到问题。如果您认为您的应用程序甚至可能接近于拥有一个如此大的向量,那么您应该事先就知道这一点。在大多数情况下,使用unsigned int
而不是std::size_t
-1不会有任何问题,因为要知道哪一个是包含std::size_t的最佳头所需要的是谷歌搜索:如果在向量末尾插入元素,其迭代器将无效,但索引不会受到影响。
typedef std::vector<Element*> ElementContainer;
ElementContainer myVector(3);
for (ElementContainer::const_iterator cit = myVector.begin();cit != myVector.end(); ++cit)
{
Element* e = *cit;
}