std::string::insert的pos参数是字节下标而非迭代器,超出范围(>length())抛out_of_range,UTF-8下按字节插入易破坏编码。
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_back 或 append
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 都可能触发内存重分配和字符搬移,时间复杂度最坏 O(n),反复在头部或中间插入大量内容时明显变慢。
+= 或 append,再统一处理s.insert(pos, std::move(temp_str)),但仅对右值引用有效std::string 是字节容器,insert 的 pos 是字节偏移,不是 Unicode 字符位置。
s.insert(1, "a") 可能插在汉字中间,破坏编码utf8cpp)计算字节位置std::u32string + std::wstring_convert(但后者 C++17 已弃用)真正写业务时,最容易被忽略的是:你以为在“第 3 个字符”处插入,实际插进了某个中文字符的中间字节里——结果整个字符串变成乱码,且调试时看不出哪里错了。