繁体   English   中英

C ++中基于范围的for循环的替代方法

[英]Alternative to range-based for loops in c++

在向量数组方面,基于范围的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循环是否有其他选择?

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循环更相似。

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中。 在第二个示例中,您将使用const引用vecArray中的值(这对于复制成本很高的对象可能很有用)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM