您现在的位置是:首页 >技术交流 >【C++语法】【STL】“for ( auto &c : str )”类型的循环网站首页技术交流
【C++语法】【STL】“for ( auto &c : str )”类型的循环
简介【C++语法】【STL】“for ( auto &c : str )”类型的循环
一、for ( auto &c : str ) 和 for ( auto c : str )
for (auto &c : line)
{
// 对 c 进行操作
}
语法解析
注:★★★c不用事先定义!
auto &c
auto:自动推导c的类型(char,如果line是std::string)。&c:引用,表示c直接绑定到line的字符上,可以修改line里的字符。
line:
- 一个
std::string或 其他支持范围遍历的容器(如vector<int>)。 c依次代表line里的每个元素。
典型实例
示例 1:遍历字符串并修改
#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:不使用 &,无法修改
#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>
#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;
}
&n 让 n 直接修改 nums 里的元素。
如果 for (auto n : nums) 没有 &,修改只会作用在 n 的拷贝上,nums 本身不会变。
总结
for (auto&c: line)遍历并修改line的字符。for (autoc: line)只会拷贝字符,无法修改原字符串。- 适用于
std::string、vector、array、set等支持begin()和end()迭代的容器。
二、for ( char &c : line ) 和 for ( char c : line )
该类型的c的数据类型为手动指定的,其余使用方法和原理与上一种类型相同,但是还是附上两个例子吧:
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 一样 |
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结