C++进阶 —— 范围for(C++11新特性)

范围for是C++11引入的新特性,用于遍历容器如数组、vector和list等。它通过迭代器自动处理元素访问,简化了代码并避免了越界问题。适用范围包括定义了begin和end方法的对象,但不适用于new创建的动态数组或多维数组的外层循环。注意,类需要定义begin和end成员函数才能使用范围for。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一,范围for介绍

二,范围for注意事项


一,范围for介绍

        范围for(range-based for loop)是C++11新引入的特性,可遍历各种序列结构的容器(如数组、vector、list等);每次循环都会将序列中的下一个元素,赋值给声明的变量,直到循环结束;

//element_declaration 声明循环变量的类型和名字
//sequence 是一个序列结构,例如数组、向量、列表等,或具有迭代器接口的对象;
for ( element_declaration : sequence ) {
    // 循环体
}

使用条件

  • 范围for迭代的范围需确定;
  • 迭代的对象要实现++和==操作;

原理是通过序列的迭代器来遍历其中的元素,编译器会自动处理迭代器的初始化、增量及结束等细节,无需手动操作;

int main()
{
	list<int> li = { 1,2,3,4 };
	for (auto i : li)
		cout << i << " ";
	return 0;
}

数组也是序列结构可通过模板函数begin/end获取相应的迭代器;

container (1)	
    template <class Container>
      auto begin (Container& cont) -> decltype (cont.begin());
    template <class Container>
      auto begin (const Container& cont) -> decltype (cont.begin());
array (2)	
    template <class T, size_t N>
      T* begin (T(&arr)[N]);
container (1)	
    template <class Container>
      auto end (Container& cont) -> decltype (cont.end());
    template <class Container>
      auto end (const Container& cont) -> decltype (cont.end());
array (2)	
    template <class T, size_t N>
      T* end (T(&arr)[N]);
int main() 
{
    int arr[] = { 1, 2, 3, 4, 5 };
    for (int* ptr = begin(arr); ptr != end(arr); ++ptr)
        std::cout << *ptr << " ";
    return 0;
}

二,范围for注意事项

  • 范围for迭代的范围是确定的,所以无需担心越界;
  • 可遍历定义了begin() 和 end() 方法的对象,如vector,set,list,map,queue,deque,string;
  • 不可使用指针(如new生成的数组)作为循环结构里的序列;
  • 由于数组在遍历的时候会转换成指针,所以在遍历多维数组的时候,除最内层循环外,其他所有循环的控制变量都要使用引用的形式。
class myclass
{
public:
    //需定义begin、end这两个成员函数,才可使用范围for
	int* begin() { return arr; }	
	int* end() { return arr + 4; }
private:
	int arr[4] = { 1,2,3,4 };
};

int main()
{
	myclass li;
	for (auto i : li)
		cout << i << " ";
	return 0;
}
int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    for (auto i : arr)
        std::cout << i << " ";
    return 0;
}
int main()
{
    int* parr = new int[5];
    //parr无合适的begin函数,报错
    for (auto i : parr)
        std::cout << i << " ";
    return 0;
}
int main()
{
	int arr[2][3] = { {1,2,3},{4,5,6} };
	//row的类型为int*,即arr内每个元素的首元素地址
	for (auto row : arr) 
		cout << row << " ";
	//row的类型为int[3]&,即arr内每个元素的类型
	for (auto& row : arr)
		cout << row << " ";

	//其中最内层的循环col类型为int[3]&,是数组
	for (auto& row : arr)
		for (auto col : row) //col的类型为int,
			cout << col << " ";
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值