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

来自cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
操作
basic_string::append
搜索
常量
推导指引 (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& append( size_type count, CharT ch );
(C++20 前)
constexpr basic_string& append( size_type count, CharT ch );
(C++20 起)
(2)
basic_string& append( const basic_string& str );
(C++20 前)
constexpr basic_string& append( const basic_string& str );
(C++20 起)
(3)
basic_string& append( const basic_string& str,
                      size_type pos, size_type count );
(C++14 前)
basic_string& append( const basic_string& str,
                      size_type pos, size_type count = npos );
(C++14 起)
(C++20 前)
constexpr basic_string& append( const basic_string& str,
                                size_type pos, size_type count = npos );
(C++20 起)
(4)
basic_string& append( const CharT* s, size_type count );
(C++20 前)
constexpr basic_string& append( const CharT* s, size_type count );
(C++20 起)
(5)
basic_string& append( const CharT* s );
(C++20 前)
constexpr basic_string& append( const CharT* s );
(C++20 起)
(6)
template< class InputIt >
basic_string& append( InputIt first, InputIt last );
(C++20 前)
template< class InputIt >
constexpr basic_string& append( InputIt first, InputIt last );
(C++20 起)
(7)
basic_string& append( std::initializer_list<CharT> ilist );
(C++11 起)
(C++20 前)
constexpr basic_string& append( std::initializer_list<CharT> ilist );
(C++20 起)
(8)
template< class StringViewLike >
basic_string& append( const StringViewLike& t );
(C++17 起)
(C++20 前)
template< class StringViewLike >
constexpr basic_string& append( const StringViewLike& t );
(C++20 起)
(9)
template< class StringViewLike >

basic_string& append( const StringViewLike& t,

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

constexpr basic_string& append( const StringViewLike& t,

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

后附额外字符到字符串。

1) 后附 countch 的副本。
2) 后附字符串 str
3) 后附 str 的子串 [pospos + count))
  • 如果请求的子串越过字符串结尾,或 count == npos,那么后附的子串是 [possize())
  • 如果 pos > str.size(),那么就会抛出 std::out_of_range
4) 后附范围 [ss + count) 中的字符。此范围可以包含空字符。
如果 [ss + count) 不是有效范围,那么行为未定义。
5) 如同用 append(s, Traits::length(s)) 后附 s 所指向的空终止字符串。
6) 后附范围 [firstlast) 中的字符。

如果 InputIt 为整数类型,那么此重载与重载 (1) 拥有相同效果。

(C++11 前)

此重载只有在 InputIt 满足 老式输入迭代器 (LegacyInputIterator) 的要求时才会参与重载决议。

(C++11 起)
7) 后附来自初始化器列表 ilist 的字符。
8) 如同用 std::basic_string_view<CharT, Traits> sv = t;t 隐式转换到字符串视图 sv ,然后如同用 append(sv.data(), sv.size()) 后附所有来自 sv 的字符。
此重载只有在 std::is_convertible_v<const StringViewLike&,
                      std::basic_string_view<CharT, Traits>>
truestd::is_convertible_v<const StringViewLike&, const CharT*>false 时才会参与重载决议。
9) 如同用 std::basic_string_view<CharT, Traits> sv = t;t 隐式转换到字符串视图 sv ,然后后附来自 sv 子视图 [pospos + count) 的字符。
  • 如果请求的子视图越过 sv 的结尾,或 count == npos,那么后附的子视图是 [possv.size())
  • 如果 pos >= sv.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 时才会参与重载决议。

参数

count - 要后附的字符数
pos - 要后附的首个字符下标
ch - 要后附的字符值
first, last - 要后附的字符范围
str - 要后附的字符串
s - 指向要后附的字符串的指针
ilist - 拥有要后附的字符的初始化器列表
t - 可转换为带要后附的字符的可以转换到 std::basic_string_view 的对象

返回值

*this

复杂度

无标准复杂度保证,典型实现表现类似 std::vector::insert()

异常

如果操作会导致 size() > max_size(),那么就会抛出 std::length_error

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

示例

#include <iostream>
#include <string>
 
int main()
{
    std::basic_string<char> str = "string";
    const char* cptr = "C-string";
    const char carr[] = "Two and one";
 
    std::string output;
 
    // 1) 后附 char 3 次。
    // 注意,这是仅有的接受 char 的重载。
    output.append(3, '*');
    std::cout << "1) " << output << "\n";
 
    //  2) 后附整个字符串
    output.append(str);
    std::cout << "2) " << output << "\n";
 
    // 3) 后附字符串的一部分(下例后附最后 3 个字母)
    output.append(str, 3, 3);
    std::cout << "3) " << output << "\n";
 
    // 4) 后附 C 字符串的一部分
    // 注意,因为 `append` 返回 *this,我们能一同链式调用
    output.append(1, ' ').append(carr, 4);
    std::cout << "4) " << output << "\n";
 
    // 5) 后附整个 C 字符串
    output.append(cptr);
    std::cout << "5) " << output << "\n";
 
    // 6) 后附范围
    output.append(std::begin(carr) + 3, std::end(carr));
    std::cout << "6) " << output << "\n";
 
    // 7) 后附初始化器列表
    output.append({' ', 'l', 'i', 's', 't'});
    std::cout << "7) " << output << "\n";
}

输出:

1) ***
2) ***string
3) ***stringing
4) ***stringing Two 
5) ***stringing Two C-string
6) ***stringing Two C-string and one
7) ***stringing Two C-string and one list

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 847 C++98 没有异常安全保证 添加强异常安全保证
LWG 2946 C++17 重载 (8) 在某些情况下会导致歧义 通过使之为模板来避免

参阅

后附字符到结尾
(公开成员函数)
连接两个字符串
(函数)
连接两个字符串的一定量字符
(函数)
后附一个宽字符串的副本到另一个
(函数)
后附来自一个宽字符串的一定量宽字符到另一个
(函数)