C++:for循环及新特性

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循环的几种用法

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C 11引入了一种新的for循环语法,它可以更简洁地遍历数组、字符串和容器。与传统的for循环不同,C 11新的for循环不需要指定遍历的范围,而是直接根据容器或数组的大小进行遍历。 新的for循环使用auto关键字来自动推断遍历对象的类型,并使用冒号来分隔遍历对象和遍历范围。例如,在遍历整型数组时,可以使用新的for循环语法如下所示: ```c++ int serven_array = {1,2,3,4,5,6,7,8,9,0}; for (auto num : serven_array) { cout << num << " "; } ``` 在这个例子中,新的for循环会自动遍历serven_array数组中的每个元素,并将其赋值给num变量,然后可以直接使用num变量访问元素的值。 类似地,新的for循环也可以用于遍历字符数组和容器。例如,可以使用以下方式遍历字符数组和输出每个字符: ```c++ char serven_char[] = "https://serven.com"; for (auto c : serven_char) { cout << c; } ``` 可以使用以下方式遍历容器vector: ```c++ vector<int> serven_vector = {1,2,3,4,5,6,7,8,9}; for (auto num : serven_vector) { cout << num << " "; } ``` 新的for循环语法简化了遍历操作,减少了代码量,并且更加易读和易写。它是C 11提供的一个方便而强大的特性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++11新特性之for循环](https://blog.csdn.net/weixin_43340455/article/details/124990290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值