std::basic_string<CharT,Traits,Allocator>::insert

来自cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
操作
basic_string::insert
搜索
常量
推导指引 (C++17)
非成员函数
I/O
比较
(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
数值转换
(C++11)(C++11)(C++11)
(C++11)(C++11)    
(C++11)(C++11)(C++11)
(C++11)
(C++11)
辅助类
 
(1)
basic_string& insert( size_type index, size_type count, CharT ch );
(C++20 前)
constexpr basic_string& insert( size_type index, size_type count, CharT ch );
(C++20 起)
(2)
basic_string& insert( size_type index, const CharT* s );
(C++20 前)
constexpr basic_string& insert( size_type index, const CharT* s );
(C++20 起)
(3)
basic_string& insert( size_type index, const CharT* s, size_type count );
(C++20 前)
constexpr basic_string& insert( size_type index,
                                const CharT* s, size_type count );
(C++20 起)
(4)
basic_string& insert( size_type index, const basic_string& str );
(C++20 前)
constexpr basic_string& insert( size_type index, const basic_string& str );
(C++20 起)
(5)
basic_string& insert( size_type index, const basic_string& str,
                      size_type s_index, size_type count );
(C++14 前)
basic_string& insert( size_type index, const basic_string& str,
                      size_type s_index, size_type count = npos);
(C++14 起)
(C++20 前)
constexpr basic_string& insert( size_type index, const basic_string& str,
                                size_type s_index, size_type count = npos);
(C++20 起)
(6)
iterator insert( iterator pos, CharT ch );
(C++11 前)
iterator insert( const_iterator pos, CharT ch );
(C++11 起)
(C++20 前)
constexpr iterator insert( const_iterator pos, CharT ch );
(C++20 起)
(7)
void insert( iterator pos, size_type count, CharT ch );
(C++11 前)
iterator insert( const_iterator pos, size_type count, CharT ch );
(C++11 起)
(C++20 前)
constexpr iterator insert( const_iterator pos, size_type count, CharT ch );
(C++20 起)
(8)
template< class InputIt >
void insert( iterator pos, InputIt first, InputIt last );
(C++11 前)
template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last );
(C++11 起)
(C++20 前)
template< class InputIt >
constexpr iterator insert( const_iterator pos, InputIt first, InputIt last );
(C++20 起)
(9)
iterator insert( const_iterator pos, std::initializer_list<CharT> ilist );
(C++11 起)
(C++20 前)
constexpr iterator insert( const_iterator pos,
                           std::initializer_list<CharT> ilist );
(C++20 起)
(10)
template < class T >
basic_string& insert( size_type pos, const T& t );
(C++17 起)
(C++20 前)
template < class T >
constexpr basic_string& insert( size_type pos, const T& t );
(C++20 起)
(11)
template < class T >

basic_string& insert( size_type index, const T& t,

                      size_type t_index, size_type count = npos);
(C++17 起)
(C++20 前)
template < class T >

constexpr basic_string& insert( size_type index, const T& t,

                                size_type t_index, size_type count = npos);
(C++20 起)

插入字符到字符串中。

1) 在位置 index 插入 count 个字符 ch 的副本。
2) 在位置 index 插入 s 所指向的空终止字符串。字符串的长度由首个空字符,通过 Traits::length(s) 确定。
3) 在位置 index 插入范围 [ss + count) 中的字符。范围可以包含空字符。
4) 在位置 index 插入字符串 str
5) 在位置 index 插入由 str.substr(s_index, count) 获得的字符串。
6)pos 所指向的字符前插入字符 ch
7)pos 所指向的元素(如果存在)前插入 count 个字符 ch 的副本。
8) 如同用 insert(pos - begin(), basic_string(first, last, get_allocator()))pos 所指向的元素(如果存在)前插入来自范围 [firstlast) 的元素。

如果 InputIt 不满足老式输入迭代器 (LegacyInputIterator) ,那么此重载不参与重载决议。

(C++11 起)
9)pos 所指向的元素(如果存在)前插入来自初始化器列表 ilist 的字符。
10) 如同用 std::basic_string_view<CharT, Traits> sv = t;t 隐式转换到字符串视图 sv ,然后如同用 insert(pos, sv.data(), sv.size())pos 所指向的元素(如果存在)前插入来自 sv 的元素。
此重载只有在 std::is_convertible_v<const StringViewLike&,
                      std::basic_string_view<CharT, Traits>>
truestd::is_convertible_v<const StringViewLike&, const CharT*>false 时才会参与重载决议。
11) 如同用 std::basic_string_view<CharT, Traits> sv = t;t 隐式转换到字符串视图 sv ,然后在 pos 所指向的元素(如果存在)前插入来自 sv 的子视图 [t_indext_index + count) 的元素。
  • 如果请求的子视图越过 sv 的末尾或 count == npos,那么作为结果的子视图是 [t_indexsv.size())
  • 如果 t_index > sv.size()index > size(),那么抛出 std::out_of_range
此重载只有在 std::is_convertible_v<const StringViewLike&,
                      std::basic_string_view<CharT, Traits>>
truestd::is_convertible_v<const StringViewLike&, const CharT*>false 时才会参与重载决议。

如果 pos 不是 *this 上的有效迭代器,那么行为未定义。

参数

index - 插入内容到的位置
pos - 将插入字符到它之前的迭代器
ch - 要插入的字符
count - 要插入的字符数
s - 指向要插入的字符串的指针
str - 要插入的字符串
first, last - 定义要插入字符的范围
s_index - str 中要插入的首字符位置
ilist - 要插入的字符来源的 std::initializer_list
t - 要插入的字符来源对象(可转换到 std::basic_string_view
t_index - t 中要插入的首字符位置
类型要求
-
InputIt 必须符合老式输入迭代器 (LegacyInputIterator) 的要求。

返回值

1-5) *this
6-9) 指代首个被插入字符的迭代器,或者在未插入字符时就是 poscount == 0ilist.size() == 0first == last
10,11) *this

异常

1-4,10)index > size() 时抛出 std::out_of_range
5)index > size()s_index > str.size() 时抛出 std::out_of_range
11)index > size()t_index > sv.size() 时抛出 std::out_of_range

在所有情况下,在 size() + ins_count > max_size() 时抛出 std::length_error,其中 ins_count 是将要插入的字符数。

在所有情况下,如果 std::allocator_traits<Allocator>::allocate 抛出了异常,那么它会被重抛。

(C++20 起)

如果因为任何原因抛出了异常,那么此函数无效果(强异常安全保证)。

示例

#include <cassert>
#include <iterator>
#include <string>
 
using namespace std::string_literals;
 
int main()
{
    std::string s = "xmplr";
 
    // insert(size_type index, size_type count, char ch)
    s.insert(0, 1, 'E');
    assert("Exmplr" == s);
 
    // insert(size_type index, const char* s)
    s.insert(2, "e");
    assert("Exemplr" == s);
 
    // insert(size_type index, string const& str)
    s.insert(6, "a"s);
    assert("Exemplar" == s);
 
    // insert(size_type index, string const& str,
    //        size_type s_index, size_type count)
    s.insert(8, " is an example string."s, 0, 14);
    assert("Exemplar is an example" == s);
 
    // insert(const_iterator pos, char ch)
    s.insert(s.cbegin() + s.find_first_of('n') + 1, ':');
    assert("Exemplar is an: example" == s);
 
    // insert(const_iterator pos, size_type count, char ch)
    s.insert(s.cbegin() + s.find_first_of(':') + 1, 2, '=');
    assert("Exemplar is an:== example" == s);
 
    // insert(const_iterator pos, InputIt first, InputIt last)
    {
        std::string seq = " string";
        s.insert(s.begin() + s.find_last_of('e') + 1,
            std::begin(seq), std::end(seq));
        assert("Exemplar is an:== example string" == s);
    }
 
    // insert(const_iterator pos, std::initializer_list<char>)
    s.insert(s.cbegin() + s.find_first_of('g') + 1, {'.'});
    assert("Exemplar is an:== example string." == s);
}

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 7 C++98 重载 (8) 的效果错误地涉及了实际不存在的重载 修正为正确地涉及重载 (4)
LWG 847 C++98 没有异常安全保证 添加强异常安全保证
LWG 2946 C++17 重载 (10) 在某些情况下会导致歧义 通过使之为模板来避免

参阅

后附字符到结尾
(公开成员函数)
后附字符到结尾
(公开成员函数)