【问题标题】:New ISO scoping rule for " for LOOP"“for LOOP”的新 ISO 范围规则
【发布时间】:2012-07-04 12:40:21
【问题描述】:

我有一段代码是在新 ISO 生效之前由其他人编写的。

for (pa=a.begin(), i=0; pa != a.end(); ++pa) 中的 for LOOP 执行起来有点麻烦,因为语法中有 i=0 部分。此外,我必须在其他 for 循环语法前面加上 int 前面的 i 来读取 for ( int i .....)。但是,我不知道如何修复这一行中的int i=0for (pa=a.begin ( ), i=0; pa != a.end ( ); ++pa)。请帮帮我。

  for ( int i = 0; pa != a.end(); ++pa)
      *pa = ++i;

  for (int i=0; i<10; i++)
      std::cout << "a[" << i << "]=" << a[i] << std::endl;

  // int i;  // note that this will work, but I do not want this extra line.

  for (pa=a.begin(), i=0; pa != a.end(); ++pa)
      std::cout << "a[" << i++ << "]=" << *pa << std::endl;

【问题讨论】:

  • 它是在 1997 年第一个标准完成之前编写的。我怀疑仅仅因为你不想要那额外的行,人们就会将语言更改为不需要它...
  • 您可以使用std::pair 或结构,但该行更容易阅读。
  • 放上多余的线,稍微退缩一下,然后继续。
  • 点很好,但我想知道是否有更“紧凑”的语法,影响: for (pa=a.begin(), int i=0; ... ....),但 int i=0;由于“int”前面的逗号,此处的声明将不起作用。任何进一步的澄清和帮助将不胜感激。

标签: c++ for-loop


【解决方案1】:

for 循环之外的额外声明是在 C++98 和更高版本的语言中拥有两个不相关类型的迭代变量的唯一明智方法。初始化器可以是单个表达式,也可以是单个声明,一个声明不能声明多个不相关类型的变量。

如果你真的想在这种情况下使用单线,那么你可以使用这个怪物:

for (int i = ((pa = a.begin()), 0); pa != a.end(); ++pa, ++i)

如果您经常做这种事情,那么请确保没有人维护您的代码知道您住在哪里。

【讨论】:

    【解决方案2】:

    不,您只能在for 中声明一种类型的变量。如果您的问题是范围,那么您可以将循环包含在一个块中(对于一些很好的示例,请查看循环宏的 boost 源代码):

    for ( int i = 0; pa != a.end(); ++pa)
        *pa = ++i;
    
    for (int i=0; i<10; i++)
        std::cout << "a[" << i << "]=" << a[i] << std::endl;
    
    {
        int i = 0;
        for (pa=a.begin(); pa != a.end(); ++pa)
            std::cout << "a[" << i++ << "]=" << *pa << std::endl;
    }
    

    如果你只是想让它变得更好,那么答案是不,你不能

    编辑
    最佳技巧我看到做你需要做的事情并保持清楚是在this answer 上。您可以使用内联声明的未命名结构来代替多个变量:

    for (struct { int i; iterator it; } d = { 0, pa.begin() }; d.it != a.end(); ++d.i, ++d.it )
        std::cout << "a[" << d.i << "]=" << *d.it << std::endl;
    

    这有点冗长(所以我想知道你用额外的行节省的东西是否会被重新支付)但是你清楚你的意图并且你保持代码可读(而且你可以用它来打包 em> 任何数量和任何类型的变量)。

    【讨论】:

    • 感谢大家的所有精彩的思想挑衅的答案!
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多