如何编写一个使用迭代器和索引计数器的for循环?

Igo*_*gor 14 c++ for-loop stl

我有一个看起来像这样的函数:

void myclass::myfunc()
{
    int i;
    for( std::vector<Foo>::iterator it = var.begin(), i = 0; it < var.end(); it++, i++ )
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

无法转换intstd::_Vector_iterator<>

这段代码有什么问题?

tem*_*def 19

问题在于for循环的这一部分:

std::vector<Foo>::iterator it = var.begin(), i = 0
Run Code Online (Sandbox Code Playgroud)

C++不是将它解释为两个以逗号分隔的语句,而是将其解释为名为it迭代器的变量的变量声明,以及作为i迭代器并初始化为0的变量的新声明.错误是因为您无法初始化一个vector迭代为0.

要解决这个问题,你需要在循环之外提升定义:

int i = 0;
std::vector<Foo>::iterator it = var.begin();
for(; it < var.end(); it++, i++ )
{
     // ...
}
Run Code Online (Sandbox Code Playgroud)

或者i在循环外部移动初始化:

int i = 0;
for( std::vector<Foo>::iterator it = var.begin(); it < var.end(); it++, i++ )
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

不过,还有最后一个选择.如果你需要跟踪你正在查看的向量中的索引,你可以考虑只使用count for循环(没有迭代器),或只使用迭代器并使用迭代器减法来恢复索引:

for (auto it = var.begin(); it != var.end(); ++it) {
    // current position is it - var.begin();
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


小智 11

你可以这样做:

int i = 0;
for( std::vector<int>::iterator it = v.begin(); it < v.end(); ++it, ++i){}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,最好只使用预增量; 虽然它对于`i`来说很重要,但它可能对于它来说很重要,这取决于迭代器的*fat*. (7认同)
  • 为什么`it ++`和`++ i`的不一致? (2认同)