【C++语法】【STL】“for ( auto &c : str )”类型的循环

一、for ( auto &c : str ) 和 for ( auto c : str )

cpp 复制代码
for (auto &c : line) 
{
    // 对 c 进行操作
}

语法解析

注:★★★c不用事先定义!

auto &c

  • auto:自动推导 c 的类型(char,如果 linestd::string)。
  • &c引用 ,表示 c 直接绑定到 line 的字符上,可以修改 line 里的字符。

line

  • 一个 std::string其他支持范围遍历的容器 (如 vector<int>)。
  • c 依次代表 line 里的每个元素。

典型实例

示例 1:遍历字符串并修改

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

int main() 
{
    std::string line = "hello";

    // 将字符串里的小写字母改成大写
    for (auto &c : line)
    { 
        c = toupper(c);
    }

    std::cout << line << std::endl; // 输出:HELLO
    return 0;
}

&c 绑定到 line 的字符上,所以 c = toupper(c); 直接修改line 里的字符。

示例 2:不使用 &,无法修改

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

int main() 
{
    std::string line = "hello";

    for (auto c : line) 
    {
        // 这里 c 是字符的副本,修改不会影响原字符串
        c = toupper(c);
    }

    std::cout << line << std::endl; // 仍然输出:hello
    return 0;
}

c 只是 line 字符的一个 拷贝 ,对 c 的修改不会影响 line 本身。

示例 3:遍历 vector<int>

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

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};

    for (auto &n : nums) { // 这里 n 是 nums 的引用
        n *= 2; // 每个元素乘 2
    }

    for (auto n : nums) {
        std::cout << n << " "; // 输出:2 4 6 8 10
    }

    return 0;
}

&nn 直接修改 nums 里的元素。

如果 for (auto n : nums) 没有 &,修改只会作用在 n 的拷贝上,nums 本身不会变。

总结

  • for (auto ``&c`` : line) 遍历并修改 line 的字符。
  • for (auto ``c`` : line) 只会拷贝字符,无法修改原字符串。
  • 适用于 std::stringvectorarrayset 等支持 begin()end() 迭代的容器

二、for ( char &c : line ) 和 for ( char c : line )

该类型的c的数据类型为手动指定的,其余使用方法和原理与上一种类型相同,但是还是附上两个例子吧:

cpp 复制代码
string line="Hello";
//例一:
for (char &c : line) 
{
    // 明确声明 c 是 char&
    c = toupper(c);
}
std::cout << line << std::endl;//输出"HELLO"
//例二:
for (auto c : line) 
{ 
    // 这里 c 不是引用,而是字符的副本
    c = toupper(c);   // 只是修改了副本,不影响原字符串
}
std::cout << line << std::endl; // 仍然是 "Hello"

终极大总结:

|-----------------------|-------------------|---------------------|
| 写法 | 是否修改 line | 说明 |
| for (auto c : line) | ❌ 不会 | c 是拷贝,修改它不会影响 line |
| for (auto &c : line) | ✅ 会 | c 是引用,修改它会改变 line |
| for (char c : line) | ❌ 不会 | c 是拷贝,和 auto c 一样 |
| for (char &c : line) | ✅ 会 | c 是引用,和 auto &c 一样 |

相关推荐
NuyoahC13 分钟前
仿 RabbitMQ 实现的简易消息队列
c++·分布式·rabbitmq·项目
Golinie15 分钟前
【C++高并发服务器WebServer】-17:阻塞/非阻塞和同步/异步、五种IO模型、Web服务器
服务器·c++·异步·webserver
kongba00725 分钟前
c语言样式主题 清爽风格 代码色彩 keil风格 适合单片机开发GD32 STM32等 cursor或者vscode 的settings.json文件
c语言·vscode·stm32·单片机
NPE~27 分钟前
[渗透测试]热门搜索引擎推荐— — fofa篇
开发语言·搜索引擎·渗透测试·php·教程·软件推荐·fofa
霍熠烁31 分钟前
Objective-C语言的云计算
开发语言·后端·golang
WANGWUSAN661 小时前
Python教程:使用Matplotlib模块画柱状图、饼形图、直方图
开发语言·经验分享·python·程序人生·matplotlib·数据可视化
cchjyq1 小时前
opencv:基于暗通道先验(DCP)的内窥镜图像去雾
java·c++·图像处理·人工智能·opencv·计算机视觉
饮长安千年月1 小时前
CVE-2024-13025-Codezips 大学管理系统 faculty.php sql 注入分析及拓展
开发语言·数据库·sql·网络安全·php
Luo_LA2 小时前
【LeetCode Hot100 堆】第 K 大的元素、前 K 个高频元素
数据结构·算法·leetcode
计算机视觉-Archer2 小时前
[NKU]C++安装环境 VScode
开发语言·c++