【问题标题】:why the for loop cannot define two scope's variables? [duplicate]为什么 for 循环不能定义两个作用域的变量? [复制]
【发布时间】:2018-08-24 09:17:42
【问题描述】:

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

【问题讨论】:

  • 因为语法是这样定义的
  • 一开始我还以为是范围造成的,现在明白了。

标签: c++ for-loop scope


【解决方案1】:

就像你可以做的那样

int a = 10, b = 20;

for 循环的第一部分做同样的事情。既然你做不到

int a = 10, double b = 20;

同样的事情也适用于 for 循环。

从技术上讲,您可以有两种不同的类型,因为您可以在同一行上声明一个类型和指向同一类型的指针,例如

int i = 0, *b = nullptr;

这在 for 循环中也是有效的。

【讨论】:

  • 是的,我明白了。谢谢
【解决方案2】:

在 C++17 中,有一个称为 structured binding declaration 的功能允许您执行此操作。例如:

for (auto [iter, i] = std::tuple{vec.begin(), 0u}; iter != vec.end(); ++iter, ++i) 
{
    /* ... */
}

虽然这几乎符合您所希望的语法,但 tuple 部分的可读性不是很好,所以我只在循环之外声明一个变量。

Live Example

【讨论】:

    【解决方案3】:

    可以,但两个变量必须是同一类型。

    当您需要维护索引和迭代器时,通常要做的事情是编写

    { // 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
        }
    }
    

    【讨论】:

    • 是的,我就是不知道为什么?
    • ..我看到了..
    • @LiKui 因为这是语言的语法。
    • 这很丑陋,但无可否认,没有更好的方法。我经常使用这个。
    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2015-12-16
    相关资源
    最近更新 更多