一、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; // 输出:HELLOreturn 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; // 仍然输出:helloreturn 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 (auto
c
: 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 一样 |