gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:33:30 24 4
gpt4 key购买 nike

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

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

我收到此错误:

Cannot convert from int to std::_Vector_iterator<>

这段代码有什么问题?

最佳答案

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

std::vector<Foo>::iterator it = var.begin(), i = 0

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

要解决此问题,您需要将定义提升到循环之外:

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

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

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

这是另一种选择。如果您需要跟踪当前正在查看的 vector 的索引,您可以考虑仅使用计数循环(不使用迭代器),或者仅使用迭代器并使用迭代器减法来恢复索引:

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

最后,如果您有一个兼容 C++20 的编译器,您可以完全消除迭代器并使用增强的 for按以下方式循环:

/* Requires C++20 */
for (int i = 0; Foo f: var) {
/* Do something worthwhile with f. */

i++;
}

希望这会有所帮助!

关于c++ - 如何编写一个同时使用迭代器和索引计数器的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17016376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com