【数据结构】字符串操作整理(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;
}
相关推荐
2501_941879817 分钟前
Python在微服务高并发异步API网关请求处理与智能路由架构中的实践
java·开发语言
闻缺陷则喜何志丹10 分钟前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
别动哪条鱼14 分钟前
AVAudioFifo
数据结构·ffmpeg·音视频
BestOrNothing_201530 分钟前
一篇搞懂 C++ 重载:函数重载 + 运算符重载,从入门到会用(含 ++、<<、== 实战)
c++·函数重载·运算符重载·operator·前置后置++·重载与重写
艾斯比的日常38 分钟前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
2501_941144421 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务
T***u3331 小时前
JavaScript在Node.js中的流处理大
开发语言·javascript·node.js
程序猿编码1 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
未来之窗软件服务1 小时前
幽冥大陆(三十四)VUE +node智慧农业电子秤读取——东方仙盟炼气期
开发语言·vue·电子秤·东方仙盟·东方仙盟sdk
Croa-vo1 小时前
TikTok 数据工程师三轮 VO 超详细面经:技术深挖 + 建模推导 + 压力测试全记录
javascript·数据结构·经验分享·算法·面试