【C++】 C++入门— 基于范围的 for 循环

C++

基于范围的for循环

1 使用样例

使用for循环遍历数组,我们通常这么写:

cpp 复制代码
#include<iostream>

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循环后的括号由冒号" :"分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

cpp 复制代码
#include<iostream>

using namespace std;

int main() {

	int array[] = {0, 1, 2, 3, 4, 5 };

	for (auto e : array)
		cout << e << " ";
	return 0;
	
}

使用auto 避免考虑数据类型。

效果也很棒:

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环

2 使用条件

  1. for循环迭代的范围必须是确定的
    对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供
    begin和end的方法,begin和end就是for循环迭代的范围。
    注意:以下代码就有问题,因为for的范围不确定

    cpp 复制代码
    void TestFor(int array[])
    {
    	//因为传入的参数是 数组首地址 无法判断 结束位置。
    	for(auto& e : array)
    	cout<< e <<endl;
    }	
  2. 迭代的对象要实现++和==的操作。(关于迭代器这个问题,我还没办法讲清楚,大家见谅)

3 完善措施

为了正确使用基于范围的for循环,需要一种方式来传递数组的大小信息到你的函数中。

有几种方法可以解决这个问题:

  1. 使用标准库容器

最推荐的方法是使用标准库中的容器,如 std::vector,因为这些类型携带大小信息并提供begin()和end()成员函数,正好适配基于范围的for循环

cpp 复制代码
#include <iostream>
#include <vector>

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);
}
  1. 使用模板确定数组大小

如果你必须使用数组,可以使用模板函数确定数组的大小:

cpp 复制代码
#include <iostream>

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);
}
  1. 明确传递数组大小

如果你不能改变函数签名(比如在一些老旧代码中),可以考虑直接传递数组的大小作为另一个参数:

cpp 复制代码
#include <iostream>

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或其他容器的使用是最推荐的方法,因为它们提供了更多的灵活性、安全性和功能。如果你的场景或现有代码限制了容器的使用,试试模板或明确传递数组大小的方案。

Thanks♪(・ω・)ノ谢谢阅读!

下一篇文章见!!!

相关推荐
Fish41748 分钟前
《C语言程序设计》琐碎知识点总结笔记
c语言·命令行参数·c语言程序设计·变量存储类型·函数存储类型·编译预处理
长安第一美人2 小时前
C 语言可变参数(...)实战:从 logger_print 到通用日志函数
c语言·开发语言·嵌入式硬件·日志·工业应用开发
Larry_Yanan2 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
superman超哥2 小时前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
不爱吃糖的程序媛2 小时前
Ascend C开发工具包(asc-devkit)技术解读
c语言·开发语言
bu_shuo2 小时前
MATLAB奔溃记录
开发语言·matlab
韩立学长2 小时前
【开题答辩实录分享】以《自助游网站的设计与实现》为例进行选题答辩实录分享
java·mysql·spring
ss2732 小时前
线程池:任务队列、工作线程与生命周期管理
java·后端
不像程序员的程序媛3 小时前
Spring的cacheEvict
java·后端·spring
SAP小崔说事儿3 小时前
在数据库中将字符串拆分成表单(SQL和HANA版本)
java·数据库·sql·sap·hana·字符串拆分·无锡sap