下图是C++标准库中 std::string 类提供的 insert 成员函数的不同重载版本,可点击C++标准库获取
以下是std::string::insert
各重载版本的功能及参数解释:
1. 插入完整字符串
string& insert(size_t pos, const string& str);
- 功能:在字符串的
pos
位置插入另一个字符串str
。 - 示例:
std::string s = "Hello"; s.insert(3, "XYZ"); // 结果:"HelXYZlo"
2. 插入子字符串
string& insert(size_t pos, const string& str, size_t subpos, size_t sublen);
- 功能:在字符串的
pos
位置插入str
中从subpos
开始的sublen
个字符。 - 注意:若
sublen
超过str
长度,则取到str
末尾。 - 示例:
std::string s = "Hello"; std::string str = "ABCDE"; s.insert(2, str, 1, 3); // 插入"BCD",结果:"HeBCDllo"
3. 插入C风格字符串
string& insert(size_t pos, const char* s);
- 功能:在
pos
位置插入以空字符结尾的C风格字符串s
。 - 示例:
std::string s = "Hello"; s.insert(4, "XYZ"); // 结果:"HellXYZo"
4. 插入指定长度的字符数组
string& insert(size_t pos, const char* s, size_t n);
- 功能:在
pos
位置插入字符数组s
的前n
个字符(即使包含\0
也会插入)。 - 示例:
std::string s = "Hello"; s.insert(1, "ABCD", 2); // 插入"AB",结果:"HABello"
5. 填充多个相同字符
string& insert(size_t pos, size_t n, char c);
- 功能:在
pos
位置插入n
个字符c
。 - 示例:
std::string s = "Hello"; s.insert(3, 4, 'X'); // 结果:"HelXXXXlo"
6. 通过迭代器插入多个字符
void insert(iterator p, size_t n, char c); // C++98中为void,C++11起返回迭代器
- 功能:在迭代器
p
指向的位置插入n
个字符c
。 - 注意:C++11后返回值改为指向插入的第一个字符的迭代器。
- 示例:
std::string s = "Hello"; s.insert(s.begin() + 2, 3, 'Z'); // 结果:"HeZZZllo"
7. 通过迭代器插入单个字符
iterator insert(iterator p, char c);
- 功能:在迭代器
p
指向的位置插入单个字符c
,返回指向插入字符的迭代器。 - 示例:
std::string s = "Hello"; auto it = s.insert(s.begin() + 1, 'X'); // 结果:"HXello",it指向'X'
8. 通过迭代器范围插入序列
template <class InputIterator>
void insert(iterator p, InputIterator first, InputIterator last);
- 功能:在迭代器
p
指向的位置插入范围[first, last)
内的字符序列。 - 示例:
std::string s = "Hello"; std::vector<char> vec {'A', 'B', 'C'}; s.insert(s.begin() + 3, vec.begin(), vec.end()); // 结果:"HelABClo"
注意事项
- 参数合法性:
pos
必须在[0, size()]
范围内,否则可能抛出std::out_of_range
异常。 - 内存分配:插入操作可能导致字符串扩容(重新分配内存)。
- 标准差异:
- C++11起部分方法返回值类型调整(如返回迭代器)。
总结
std::string::insert
提供了多种灵活的插入方式,覆盖从字符串片段到迭代器范围的操作。选择合适的方法可以高效处理字符串拼接、填充或动态修改需求。