为什么for循环不能定义两个范围的变量?

时间:2018-03-15 14:03:19

标签: c++ for-loop scope

我对" ' 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
    }
}

3 个答案:

答案 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部分的可读性不高,所以我只是在循环之外声明其中一个变量。

Live Example

答案 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
    }
}