Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代向量元素时,索引类型应该是什么?_C++_Loops_Types_Indexing_Stdvector - Fatal编程技术网

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;
    }