【数据结构】字符串操作整理(C++)

1. 字符串长度与容量

size() / length()
  • 定义:返回字符串的当前长度(字符数)。

  • 用法

    cpp 复制代码
    string s = "hello";
    cout << s.size();  // 输出:5
  • 提示size()length() 功能完全相同,可互换使用。

capacity()
  • 定义:返回当前分配给字符串的内存容量(字符数)。

  • 用法

    cpp 复制代码
    string s = "hello";
    cout << s.capacity();  // 可能输出:15(取决于编译器实现)
  • 提示:容量通常大于实际长度,以避免频繁重新分配内存。

2. 字符串修改

push_back(char c)
  • 定义:在字符串末尾添加一个字符。

  • 用法

    cpp 复制代码
    string s = "abc";
    s.push_back('d');  // s 变为 "abcd"
  • 提示 :等效于 s += c,但 push_back() 更明确表示添加单个字符。

append(const string& str)
  • 定义:在字符串末尾追加另一个字符串。

  • 用法

    复制代码
    string s = "hello";
    s.append(" world");  // s 变为 "hello world"
  • 提示 :支持追加子串(如 append(str, pos, len))或字符数组。

erase(pos, len)
  • 定义 :从位置 pos 开始删除 len 个字符(若省略 len,则删除到末尾)。

  • 用法

    cpp 复制代码
    string s = "hello";
    s.erase(1, 2);  // s 变为 "hlo"
  • 提示:删除后,后续字符会前移填补空缺,可能影响迭代器。

3. 字符串查找

find(const string& str, pos)
  • 定义 :从位置 pos 开始查找子串 str,返回首次出现的位置;若未找到,返回 string::npos

  • 用法

    cpp 复制代码
    string s = "hello";
    size_t pos = s.find("ll");  // pos = 2
  • 提示 :查找失败时需检查 pos == string::npos

rfind(const string& str)
  • 定义:从后往前查找子串,返回最后一次出现的位置。

  • 用法

    cpp 复制代码
    string s = "abab";
    size_t pos = s.rfind("ab");  // pos = 2

4. 字符串子串

substr(pos, len)
  • 定义 :返回从位置 pos 开始的 len 个字符的子串(若省略 len,则截取到末尾)。

  • 用法

    cpp 复制代码
    string s = "hello";
    string sub = s.substr(1, 3);  // sub 为 "ell"
  • 提示substr(pos) 可用于截取后缀子串。

5. 字符串替换

replace(pos, len, const string& str)
  • 定义 :将从位置 pos 开始的 len 个字符替换为 str

  • 用法

    cpp 复制代码
    string s = "hello";
    s.replace(1, 3, "XYZ");  // s 变为 "hXYZo"
  • 提示:替换前后的字符串长度可能不同,需注意后续字符位置变化。

6. 字符串比较

compare(const string& str)
  • 定义 :比较两个字符串的字典序。返回值:

    • 0:相等
    • 负值:当前字符串小于 str
    • 正值:当前字符串大于 str
  • 用法

    cpp 复制代码
    string s1 = "abc";
    string s2 = "abd";
    cout << s1.compare(s2);  // 输出负值(如 -1)
  • 提示 :更常用 ==<> 等运算符进行比较。

7. 字符串与数值转换

stoi(const string& str)
  • 定义 :将字符串转换为整数(类似的有 stolstod 等)。

  • 用法

    cpp 复制代码
    string s = "123";
    int num = stoi(s);  // num = 123
  • 提示 :若字符串格式非法,会抛出 invalid_argumentout_of_range 异常。

to_string(int value)
  • 定义:将数值转换为字符串(支持各种数值类型)。

  • 用法

    cpp 复制代码
    int num = 123;
    string s = to_string(num);  // s = "123"

注意事项

  1. 迭代器失效 :在修改字符串(如 eraseinsert)后,原有的迭代器、引用和指针可能失效。
  2. 性能考虑:频繁的插入或删除操作可能导致内存重新分配,效率较低。
  3. 空字符串检查 :使用 empty() 而非 size() == 0 检查字符串是否为空。
  4. 边界检查 :访问或操作字符串时,确保索引不越界(可用 at(pos) 替代 [],越界时抛出异常)。

示例

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    std::string s = "hello";
    
    // 修改
    s.push_back('!');  // "hello!"
    s.append(" world");  // "hello! world"
    
    // 查找
    size_t pos = s.find("world");  // 7
    
    // 替换
    if (pos != std::string::npos) {
        s.replace(pos, 5, "universe");  // "hello! universe"
    }
    
    // 子串
    std::string sub = s.substr(6, 3);  // "! u"
    
    // 转换
    int num = 42;
    std::string numStr = std::to_string(num);  // "42"
    
    std::cout << s << "\n";  // 输出:hello! universe
    return 0;
}
相关推荐
二猛子1 分钟前
排序算法-归并排序与快速排序
数据结构·c++·算法·排序算法
泰勒疯狂展开9 分钟前
Java研学-MongoDB(一)
java·开发语言·mongodb
机器学习之心HML16 分钟前
聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化
开发语言·matlab·聚类
yxc_inspire32 分钟前
基于Qt的app开发的过渡期
c++·qt·tcp
MarkHard12334 分钟前
JavaSE知识总结 ~个人笔记以及不断思考~持续更新
java·开发语言·笔记
瓦特what?37 分钟前
C++中实现随机数(超详细!)
开发语言·c++·windows·算法
梁下轻语的秋缘43 分钟前
每日c/c++题 备战蓝桥杯(洛谷P1481 魔族密码 题解)
c语言·c++·蓝桥杯
Humbunklung1 小时前
Rust 变量与可变性
开发语言·算法·rust
C66668881 小时前
TCP/IP协议
开发语言·tcp/ip·计算机视觉·信息与通信
Lester_11011 小时前
嵌入式学习笔记 - freeRTOS在程序开始在任务内创建任务的好处是什么
java·开发语言·freertos