目录
FOR循环的三种用法
一、 for(int i=0;i<N;I++)
最简单最常用的方法:
int nums[] = { 3, 4, 2, 9, 15, 267 };
const int N = 6;
for (int i = 0; i < N; i++) {
cout << nums[i] << " ";
}
cout << endl << endl;
二、for_each
for_each(nums, nums + N, vecFunc);
nums是一个数组,N是数组的个数,vecFunc是一个函数,也可以是lamba表达式
int nums[] = { 3, 4, 2, 9, 15, 267 };
const int N = 6;
for_each(nums,nums+N,[](int item){
cout << item+1 << " ";
});
for_each (vec.begin(), vec.end(), vecFunc);
for_each也可以适用于容器,使用迭代器的方式遍历,并更改其中的值
vector<int> vecNum(nums,nums+N);
string strText = "ABCDEFJHJKLMN";
for_each(strText.begin(),strText.end(),[](char item){
cout << item << " ";
});
cout << endl ;
for_each(vecNum.begin(),vecNum.end(),[](int item){
cout << item << " ";
});
cout << endl ;
三、for (类型 变量 : 数组或容器)
遍历数组和容器,这是C++11里的特性,(见C++11基于范围的for循环)
int nums[] = { 3, 4, 2, 9, 15, 267 };
const int N = 6;
vector<int> vecNum(nums,nums+N);
for(int var:nums)
{
cout << var << " ";
}
cout << endl ;
for(int var:vecNum)
{
cout << var << " ";
}
C++ for循环的新特性
一、C++11 基于范围的for循环
1、语法格式
for (for-range-declaration : for-range-initializer) {
// 循环体
}
for-range-declaration:迭代变量
for-range-initializer是一个表示容器或数组的表达式
2、迭代变量
迭代变量for-range-declaration,表示每一次迭代中从for-range-initializer获取的元素的值或索引,可以是基础类型或者自动类型推断
a、 基础类型
vector<int> numbers = {1,2,3,4,5};
for(int number : numbers)
{
cout << number << " ";
}
float arr[] = {1.0f,2.0f,3.0f};
for(float i : arr){
cout << i << " ";
}
b、自动类型推断
范围for循环可以和C++11的别一个特性:自动类型推断(auto)一起使用,使代码更加简洁。
auto类型
auto &类型
auto &&类型
const auto &类型
(1)auto类型
使用auto类型的迭代变量进行遍历集合时,实际上迭代变量只是集合中数据元素的拷贝。在这种情况下,循环体中不论怎么修改迭代变量的数据,都不会影响到原有集合中的数据元素
vector<int> v1 = {9,8,7,6,5};
for(auto v : v1)
{
v+=1;
cout << v << " ";
}
//输出:10,9,8,7,6
//只读的遍历
for(const auto& v:v1)
{
cout << v << " ";
}
//输出:9,8,7,6,5
cout << endl;
(2)auto &类型
使用auto &类型的迭代变量进行遍历时,迭代变量是一个非常量左值引用,它是集合中数据元素的引用,如果对迭代变量进行修改,会直接影响到集合数据元素本身
//可修改的遍历
vector<int> v1 = {9,8,7,6,5};
for(auto& v : v1)
{
v *= 2;
}
//只读的遍历
for(const auto& v:v1)
{
cout << v << " ";
}
//输出:18,16,14,12,10
(3)auto &&类型
临时对象或者右值对象不能绑定在非常量左值引用,使用**auto &声明迭代变量时会发生编译错误,需要使用auto&&**非常量右值引用进行声明
vector<bool> vec {true, false, true, false};
// for (auto &a : vec) { // 编译报错
for (auto &&a : vec) { // 编译通过
cout << a << " ";
}
vector<bool> vec {true, false, true, false};
bool &v = vec[0]; // 编译报错, vec[0]不是一个左值
bool *w = &vec; // 编译报错,无法将一个临时变量地址绑定给指针
auto &&u = vec[0]; // 编译通过,非常量右值引用
(4)const auto &类型
在auto &的前面加上了const修饰,意味着迭代变量是集合中数据元素的引用,但是它是只读的不能被修改
//向量vector
vector<int> v1 = {9,8,7,6,5};
for(const auto& v:v1)
{
cout << v << " ";
}
//输出:9,8,7,6,5
//映射map
map<int,string> m1 = {{1,"A"},{2,"B"},{3,"C"}};
for(const auto& it:m1)
{
cout << "\r\nkey:"<<it.first << " value:"<< it.second ;
}
//输出:
//key:1 value:A
//key:2 value:B
//key:3 value:C
3、使用注意
1、在循环中修改集合中的元素个数会导致输出错误或者崩溃
2、迭代器的生命周期接收后,遍历无效
二、C++11带有初始化列表的for循环
1、语法
这种形式允许在循环中遍历指定的初始化列表。
带有初始化列表的 for 循环适用于需要遍历一组预定义元素的情况,无需显式定义容器。它提供了一种简洁、直观的方式来遍历固定的元素序列
for (type variable : {value1, value2, value3, ...}) {
// 循环体
}
2、示例
for(const auto& it:{1,2,3,4,5})
{
cout << it <<" ";
}
三、C++17结构化绑定的for循环
1、语法
这种形式用于遍历关联容器(如 std::map)中的键值对,同时可以使用结构化绑定语法来将键和值分别绑定到变量 key 和 value
for (auto& [key, value] : map) {
// 循环体
}
2、示例
//用于遍历关联容器中的键值对
std::map<std::string, int> scores = {{"Alice", 90}, {"Bob", 80}, {"Charlie", 70}};
// 使用结构化绑定的 for 循环遍历 map 的键值对
for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << '\n';
}
参考:
C++ for循环,你真的学懂了吗
【C++ 11】(二)基于范围的for循环
C++六种for循环
C/C++ for循环的几种用法