string 类元素访问方法

目录

[一、使用下标运算符 \[\] 访问元素](#一、使用下标运算符 [] 访问元素)

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

三、使用范围for循环访问元素

四、使用迭代器访问元素

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

六、方法比较表


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

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循环则提供了最简洁的语法。

相关推荐
yaoxin5211238 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫9 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp9 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的9 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉9 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉9 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
凡人叶枫10 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员10 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean10 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
LabVIEW开发11 小时前
LabVIEW + MATLAB 混合编程:爆炸场测试数据精准采集方案
开发语言·matlab·labview