C++ 参考手册

位置:首页 > C++ 参考手册 >字符串库 >std::basic_string > std::basic_string<CharT,Traits,Allocator>::append

basic_string& append( const T& t,

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

constexpr basic_string& append( const T& t,

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

后附额外字符到字符串。

1) 后附 countch 的副本
2) 后附 string str
3) 后附 str 的子串 [pos, pos+count) 。若请求的子串越过 string 结尾,或若 count == npos ,则后附的子串为 [pos, size()) 。若 pos > str.size() ,则抛出 std::out_of_range
4) 后附范围 [s, s + count) 中的字符。此范围能含有空字符。
5) 后附 s 所指向的空终止字符串。由首个空字符用 Traits::length(s) 确定字符串的长度。
6) 后附范围 [first, last) 中的字符。

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

(C++11 前)

此重载仅若 InputIt 满足 遗留输入迭代器 (LegacyInputIterator) 的要求才参与重载决议。

(C++11 起)
7) 后附来自 initializer_list ilist 的字符。
8) 如同用 std::basic_string_view<CharT, Traits> sv = t; 隐式转换 t 为 string_view sv ,然后如同用 append(sv.data(), sv.size()) 后附所有来自 sv 的字符。此重载仅若 std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>truestd::is_convertible_v<const T&, const CharT*>false 才参与重载决议。
9) 如同用 std::basic_string_view<CharT, Traits> sv = t; 隐式转换 t 为 string_view sv ,然后后附来自 sv 子视图 [pos, pos+count) 的字符。若请求的子视图越过 sv 的结尾,或若 count == npos ,则后附的子视图为 [pos, sv.size()) 。此重载仅若 std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>truestd::is_convertible_v<const T&, const CharT*>false 才参与重载决议。

参数

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

返回值

*this

复杂度

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

异常

若因任何原因抛出异常,则此函数无效果(强异常保证)。 (C++11 起)

若操作会导致 size() > max_size() ,则抛出 std::length_error

缺陷报告

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

DR 应用于 出版时的行为 正确行为
LWG 2946 C++17 string_view 重载在某些情况下导致歧义 通过使之为模板来避免

示例

#include <string>
#include <iostream>
 
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) 后附整个 string
    output.append(str);
    std::cout << "2) " << output << "\n";
 
    // 3) 后附字符串的一部分(此情况为最后 3 个字母)case)
    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) 后附 initializer_list
    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

参阅

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