-2

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

由于语法的一部分,forLOOP infor (pa=a.begin(), i=0; pa != a.end(); ++pa)执行起来有点麻烦。i=0此外,我必须在其他for循环语法前面for ( int i .....) 加上. 但是,我不知道如何解决这一行: . 请帮帮我。intiint 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;
4

2 回答 2

4

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

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

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

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

于 2012-07-04T12:53:36.577 回答
3

不,您只能在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;
}

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

编辑我看到的做你需要的事情并保持清楚
最好技巧是关于 SO的这个答案。您可以使用内联声明的未命名结构来代替多个变量:

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;

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

于 2012-07-04T12:47:08.477 回答