目录
[一、使用下标运算符 [] 访问元素](#一、使用下标运算符 [] 访问元素)
[二、使用 at() 方法访问元素](#二、使用 at() 方法访问元素)

一、使用下标运算符 [] 访问元素

string 类重载了下标运算符 [],可以直接通过下标访问和修改元素。该运算符返回字符的引用,因此可以用于修改操作。
cpp
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const; // const版本
特点:
-
访问速度快,效率高
-
不进行边界检查,访问越界时行为未定义
-
适用于已知安全边界的快速访问
示例代码:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s("CSDN");
// 读取元素
for (size_t i = 0; i < s.size(); i++) {
cout << s[i]; // 输出: CSDN
}
cout << endl;
// 修改元素
for (size_t i = 0; i < s.size(); i++) {
s[i] = 'x'; // 修改每个字符
}
cout << s << endl; // 输出: xxxx
return 0;
}

二、使用 at() 方法访问元素

at() 方法提供带边界检查的元素访问,同样返回字符的引用。
cpp
char& at(size_t pos);
const char& at(size_t pos) const; // const版本
特点:
-
进行边界检查,越界时抛出 std::out_of_range 异常
-
比 [] 运算符稍慢,但更安全
-
适用于不确定边界的情况
示例代码:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s("CSDN");
// 安全读取元素
for (size_t i = 0; i < s.size(); i++) {
cout << s.at(i); // 输出: CSDN
}
cout << endl;
// 安全修改元素
for (size_t i = 0; i < s.size(); i++) {
s.at(i) = 'x';
}
cout << s << endl; // 输出: xxxx
// 越界访问示例(会抛出异常)
try {
cout << s.at(10) << endl;
} catch (const out_of_range& e) {
cerr << "错误: " << e.what() << endl;
}
return 0;
}

三、使用范围for循环访问元素
C++11引入的范围for循环提供简洁的元素访问语法。
特点:
-
语法简洁明了
-
自动处理边界问题
-
修改元素需要使用引用类型
示例代码:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s("CSDN");
// 只读访问
for (char c : s) {
cout << c; // 输出: CSDN
}
cout << endl;
// 修改元素(必须使用引用)
for (char& c : s) {
c = 'x';
}
cout << s << endl; // 输出: xxxx
// 使用auto自动推导类型
for (auto& c : s) {
c += 1; // 每个字符ASCII值加1
}
cout << s << endl; // 输出: yyyy
return 0;
}

四、使用迭代器访问元素
迭代器提供了一种通用的容器元素访问方式,适用于所有STL容器。
cpp
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
特点:
-
提供统一的容器访问接口
-
支持各种STL算法
-
可以灵活控制遍历过程
示例代码:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s("CSDN");
// 使用迭代器读取元素
string::iterator it = s.begin();
while (it != s.end()) {
cout << *it;
++it;
}
cout << endl; // 输出: CSDN
// 使用迭代器修改元素
for (auto it = s.begin(); it != s.end(); ++it) {
*it += 1; // 每个字符ASCII值加1
}
cout << s << endl; // 输出: DTEO
// 使用const迭代器(只读)
const string cs("CONST");
for (auto it = cs.begin(); it != cs.end(); ++it) {
cout << *it; // 输出: CONST
// *it = 'x'; // 错误:不能修改const对象
}
cout << endl;
return 0;
}

五、访问首尾元素(C++11新增)


C++11新增了直接访问首尾元素的便捷方法。
cpp
char& front(); // 访问第一个元素
char& back(); // 访问最后一个元素
const char& front() const;
const char& back() const;
示例代码:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s("CSDN");
cout << "首字符: " << s.front() << endl; // 输出: C
cout << "尾字符: " << s.back() << endl; // 输出: N
s.front() = 'A';
s.back() = 'M';
cout << s << endl; // 输出: ASDM
return 0;
}

六、方法比较表
访问方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
下标运算符[] | 速度快,效率高 | 无边界检查 | 已知安全边界的快速访问 |
at()方法 | 有边界检查,安全 | 性能略低 | 需要安全保证的访问 |
范围for循环 | 语法简洁,自动边界检查 | 不能灵活控制遍历过程 | 简单遍历整个字符串 |
迭代器 | 灵活,通用性强 | 语法相对复杂 | 需要复杂遍历或使用STL算法 |
front()/back() | 直接访问首尾元素 | 只能访问首尾 | 只需访问首尾元素时 |
选择适当的元素访问方法可以使代码更高效、更安全。在性能关键代码中,[] 运算符是最快选择;在安全性更重要的场景中,at() 方法更合适;范围for循环则提供了最简洁的语法。