string 类元素访问方法
目录
一、使用下标运算符 [] 访问元素
二、使用 at() 方法访问元素
三、使用范围for循环访问元素
四、使用迭代器访问元素
五、访问首尾元素(C++11新增)
六、方法比较表
一、使用下标运算符 [] 访问元素
string 类重载了下标运算符 [],可以直接通过下标访问和修改元素。该运算符返回字符的引用,因此可以用于修改操作。
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const; // const版本
特点:
-
访问速度快,效率高
-
不进行边界检查,访问越界时行为未定义
-
适用于已知安全边界的快速访问
示例代码:
#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; // 输出: xxxxreturn 0;
}
二、使用 at() 方法访问元素
at() 方法提供带边界检查的元素访问,同样返回字符的引用。
char& at(size_t pos);
const char& at(size_t pos) const; // const版本
特点:
-
进行边界检查,越界时抛出 std::out_of_range 异常
-
比 [] 运算符稍慢,但更安全
-
适用于不确定边界的情况
示例代码:
#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循环提供简洁的元素访问语法。
特点:
-
语法简洁明了
-
自动处理边界问题
-
修改元素需要使用引用类型
示例代码:
#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; // 输出: yyyyreturn 0;
}
四、使用迭代器访问元素
迭代器提供了一种通用的容器元素访问方式,适用于所有STL容器。
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
特点:
-
提供统一的容器访问接口
-
支持各种STL算法
-
可以灵活控制遍历过程
示例代码:
#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新增了直接访问首尾元素的便捷方法。
char& front(); // 访问第一个元素
char& back(); // 访问最后一个元素
const char& front() const;
const char& back() const;
示例代码:
#include <iostream>
#include <string>
using namespace std;int main() {string s("CSDN");cout << "首字符: " << s.front() << endl; // 输出: Ccout << "尾字符: " << s.back() << endl; // 输出: Ns.front() = 'A';s.back() = 'M';cout << s << endl; // 输出: ASDMreturn 0;
}
六、方法比较表
访问方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
下标运算符[] | 速度快,效率高 | 无边界检查 | 已知安全边界的快速访问 |
at()方法 | 有边界检查,安全 | 性能略低 | 需要安全保证的访问 |
范围for循环 | 语法简洁,自动边界检查 | 不能灵活控制遍历过程 | 简单遍历整个字符串 |
迭代器 | 灵活,通用性强 | 语法相对复杂 | 需要复杂遍历或使用STL算法 |
front()/back() | 直接访问首尾元素 | 只能访问首尾 | 只需访问首尾元素时 |
选择适当的元素访问方法可以使代码更高效、更安全。在性能关键代码中,[] 运算符是最快选择;在安全性更重要的场景中,at() 方法更合适;范围for循环则提供了最简洁的语法。