网站识别手机电脑代码,苏州建设局网站,做微网站必须要有公众号吗,网站分享设计C 基于范围的for循环1 使用样例2 使用条件3 完善措施 Thanks♪(#xff65;ω#xff65;)#xff89;谢谢阅读#xff01;下一篇文章见#xff01;#xff01;#xff01; 基于范围的for循环
1 使用样例
使用for循环遍历数组#xff0c;我们通常这么写#xff1a; … C 基于范围的for循环1 使用样例2 使用条件3 完善措施 Thanks♪(ω)谢谢阅读下一篇文章见 基于范围的for循环
1 使用样例
使用for循环遍历数组我们通常这么写
#includeiostreamusing 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循环的范围让他遍历整个数组但是对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。 因此C11中引入了基于范围的for循环。
for循环后的括号由冒号“ ”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围
#includeiostreamusing namespace std;int main() {int array[] {0, 1, 2, 3, 4, 5 };for (auto e : array)cout e ;return 0;}使用auto 避免考虑数据类型。
效果也很棒 注意与普通循环类似可以用continue来结束本次循环也可以用break来跳出整个循环
2 使用条件
for循环迭代的范围必须是确定的 对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供 begin和end的方法begin和end就是for循环迭代的范围。 注意以下代码就有问题因为for的范围不确定void TestFor(int array[])
{//因为传入的参数是 数组首地址 无法判断 结束位置。for(auto e : array)cout e endl;
} 迭代的对象要实现和的操作。(关于迭代器这个问题我还没办法讲清楚大家见谅)
3 完善措施
为了正确使用基于范围的for循环需要一种方式来传递数组的大小信息到你的函数中。
有几种方法可以解决这个问题
使用标准库容器
最推荐的方法是使用标准库中的容器如 std::vector因为这些类型携带大小信息并提供begin()和end()成员函数正好适配基于范围的for循环。
#include iostream
#include vectorvoid TestFor(const std::vectorint arr) {for(auto e : arr) {std::cout e std::endl;}
}int main() {std::vectorint v {1, 2, 3, 4, 5};TestFor(v);
}使用模板确定数组大小
如果你必须使用数组可以使用模板函数确定数组的大小
#include iostreamtemplatesize_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 iostreamvoid 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或其他容器的使用是最推荐的方法因为它们提供了更多的灵活性、安全性和功能。如果你的场景或现有代码限制了容器的使用试试模板或明确传递数组大小的方案。
Thanks♪(ω)谢谢阅读
下一篇文章见