使用for循环遍历数组,我们通常这么写:
#include
using namespace std;
int main() {
int arr[] = {0, 1, 2, 3, 4, 5 };
for(int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++){
cout << arr[i] << " ";
}
return 0;
}
上面的代码我们给出了for循环的范围,让他遍历整个数组,但是对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。
因此C++11中引入了基于范围的for循环。
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围
#include
using namespace std;
int main() {
int array[] = {0, 1, 2, 3, 4, 5 };
for (auto e : array)
cout << e << " ";
return 0;
}
使用auto 避免考虑数据类型。
效果也很棒:
注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环
注意:以下代码就有问题,因为for的范围不确定
void TestFor(int array[])
{
//因为传入的参数是 数组首地址 无法判断 结束位置。
for(auto& e : array)
cout<< e <<endl;
}
为了正确使用基于范围的for循环,需要一种方式来传递数组的大小信息到你的函数中。
有几种方法可以解决这个问题:
最推荐的方法是使用标准库中的容器,如 std::vector,因为这些类型携带大小信息并提供begin()和end()成员函数,正好适配基于范围的for循环。
#include
#include
void TestFor(const std::vector<int>& arr) {
for(auto& e : arr) {
std::cout << e << std::endl;
}
}
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
TestFor(v);
}
如果你必须使用数组,可以使用模板函数确定数组的大小:
#include
template<size_t N>
//给定数组大小
void TestFor(int (&array)[N]) {
for(auto& e : array) {
std::cout << e << std::endl;
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
TestFor(arr);
}
如果你不能改变函数签名(比如在一些老旧代码中),可以考虑直接传递数组的大小作为另一个参数:
#include
void TestFor(int* array, size_t size) {
for(size_t i = 0; i < size; ++i) {
std::cout << array[i] << std::endl;
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
TestFor(arr, sizeof(arr)/sizeof(arr[0]));
}
这种方法虽然不利用了基于范围的for循环,但能处理数组丢失大小信息的问题。
std::vector或其他容器的使用是最推荐的方法,因为它们提供了更多的灵活性、安全性和功能。如果你的场景或现有代码限制了容器的使用,试试模板或明确传递数组大小的方案。