【问题标题】:Alternative to range-based for loops in c++c++ 中基于范围的 for 循环的替代方案
【发布时间】:2015-03-07 23:16:34
【问题描述】:

对于向量数组,是否有基于范围的 for 循环的替代方法?我注意到 c++98 不允许基于范围的 for 循环。下面是一些使用基于范围的 for 循环遍历向量数组的示例代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> vecArray1 (3,20);
  for (int v: vecArray1) {
    cout << "ArrayValue:" << v << endl;
  }
  return 0;
}

现在这是我尝试过的另一种方法,但不起作用:

#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> vecArray1 (3,20);
  for (int i=0; i<sizeof(vecArray1); ++i) {
    cout << "ArrayValue:" << vecArray1[i] << endl;
  }
  return 0;
}

它输出 10 个元素,而不是上面向量数组定义的 3 个元素。在 c++98 中是否有基于范围的 for 循环的替代方案?

【问题讨论】:

标签: c++ arrays for-loop vector


【解决方案1】:

C++98 不允许基于范围的 for 循环。 在 C++98 中,您需要执行以下操作:

for(unsigned int i=0;i<vecArray.size();++i)
    std::cout << "ArrayValue: " << vecArray[i] << std::endl;

for(std::vector<int>::iterator it=vecArray.begin();it!=vecArray.end();++it)
    std::cout << "ArrayValue: " << *it << std::endl;

运营商

sizeof

不给你数组的长度。相反,它返回一个无符号整数,表示您作为参数提供的类型的字节数。 例如,

std::cout << sizeof(unsigned long long) << std::endl;

打印

8

在我的机器上,因为 unsigned long long 类型由 64 位或 64/8 = 8 个字节组成。

在 C++11 中,我们现在有了基于范围的 for 循环:

例子:

for(int i : vecArray)
    std::cout << "i = " << i << std::endl;

for(const int& i : vecArray)
    std::cout << "i = " << i << std::endl;

在第一个示例中,值从 vecArray 复制到变量 i 中。在第二个示例中,您改为使用对 vecArray 中的值的 const 引用(这对于复制成本高昂的对象可能很有用)。

事实上,C++11 中基于范围的 for 循环适用于所有可以调用 begin() 和 end() 的类型(即可以迭代的类型)。

【讨论】:

    【解决方案2】:

    sizeof(vecArray1) 并没有按照你的想法去做。

    任意使用:

    for (int i=0; i<vecArray1.size(); ++i) {
        cout << "ArrayValue:" << vecArray1[i] << endl;
    }
    

    或:

    for (std::vector<int>::iterator it = vecArray1.begin(); it != vecArray1.end(); it++) {
        cout << "ArrayValue: " << *it << endl;
    }
    

    第二个更详细,但也适用于其他类型的集合(如std::list),并且更类似于基于范围的 for 循环。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多