我对" ' iter'未在此范围内宣布"错误。
#include <vector>
using std::vector;
int main()
{
vector<int> vec{1,2,3,4,5,6};
for(std::size_t i,vector<int>::iterator iter=vec.begin();iter!=vec.end();++i,++iter)
{
//do something
}
}
答案 0 :(得分:13)
就像你可以做的那样
int a = 10, b = 20;
for循环的第一部分做同样的事情。既然你做不了
int a = 10, double b = 20;
同样适用于for循环。
从技术上讲,你可以有两种不同的类型,因为你可以在同一行声明一个类型和指向同一类型的指针,如
int i = 0, *b = nullptr;
这也适用于for循环。
答案 1 :(得分:6)
在C ++ 17中,有一个称为structured binding declaration的功能允许您执行此操作。例如:
for (auto [iter, i] = std::tuple{vec.begin(), 0u}; iter != vec.end(); ++iter, ++i)
{
/* ... */
}
虽然这几乎与您希望的语法相匹配,但tuple
部分的可读性不高,所以我只是在循环之外声明其中一个变量。
答案 2 :(得分:5)
可以,但两个变量都必须是同一类型。
当您需要维护索引以及迭代器时,常见的事情是编写
{ // extra scoping block
std::size_t i = 0; // indeed, you need to initialise i
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++i,++iter)
{
// do something
}
}