C++ string insert用法 C++字符串指定位置插入内容示例【操作】

std::string::insert的pos参数是字节下标而非迭代器,超出范围(>length())抛out_of_range,UTF-8下按字节插入易破坏编码。

c++ string insert用法 c++字符串指定位置插入内容示例【操作】

insert 位置参数是下标,不是迭代器(常见错误)

C++ std::string::insert 的重载很多,但最常用的是 insert(size_t pos, const string& str) —— 这里的 pos字符下标位置(从 0 开始),不是迭代器。传错类型会导致编译失败或意外行为。

  • 如果你手头有迭代器 it,得先转成下标:s.insert(it - s.begin(), "abc")
  • pos 超出范围(比如大于 s.length())会抛 std::out_of_range
  • pos == s.length() 是合法的,等价于 push_backappend

插入空字符串或越界长度不会报错,但可能不符合预期

insert 对空字符串、零长度子串是安全的,但容易误判逻辑:

  • s.insert(2, "") 没效果,但不报错
  • s.insert(2, "x", 0)(插入长度为 0 的 C 风格子串)同样静默成功
  • substr 提前截取时要注意:若起始位置超出原串长度,substr 会返回空串,再 insert 就白忙活

示例:

std::string s = "hello";
s.insert(2, "XX"); // s 变成 "heXXllo"
s.insert(s.length(), "!"); // s 变成 "heXXllo!"

性能敏感场景慎用多次 insert

每次 insert 都可能触发内存重分配和字符搬移,时间复杂度最坏 O(n),反复在头部或中间插入大量内容时明显变慢。

Civitai

Civitai

AI艺术分享平台!海量SD资源和开源模型。

下载

立即学习C++免费学习笔记(深入)”;

  • 若需拼接多个片段,优先用 +=append,再统一处理
  • 若必须多点插入,考虑先收集所有插入位置和内容,逆序执行(避免下标偏移)
  • 移动语义可用:s.insert(pos, std::move(temp_str)),但仅对右值引用有效

中文或 UTF-8 字符串插入要按字节还是字符?

std::string 是字节容器,insertpos字节偏移,不是 Unicode 字符位置。

  • 在 UTF-8 编码下,一个汉字占 3 字节,s.insert(1, "a") 可能插在汉字中间,破坏编码
  • 没有内置方法按“字符”插入;如需按 Unicode 位置操作,必须先用 UTF-8 解码库(如 utf8cpp)计算字节位置
  • 简单规避方式:只在已知 ASCII 边界(如纯英文前缀后)插入,或改用 std::u32string + std::wstring_convert(但后者 C++17 已弃用)

真正写业务时,最容易被忽略的是:你以为在“第 3 个字符”处插入,实际插进了某个中文字符的中间字节里——结果整个字符串变成乱码,且调试时看不出哪里错了。

https://www.php.cn/faq/2027401.html

发表回复

Your email address will not be published. Required fields are marked *