std::basic_string<CharT,Traits,Allocator>::assign
来自 cppreference.com
< cpp | string | basic string
basic_string& assign( size_type count, CharT ch ); |
(1) | (从 C++20 开始为 constexpr) |
basic_string& assign( const basic_string& str ); |
(2) | (从 C++20 开始为 constexpr) |
(3) | ||
basic_string& assign( const basic_string& str, size_type pos, size_type count ); |
(直到 C++14) | |
basic_string& assign( const basic_string& str, size_type pos, size_type count = npos); |
(从 C++14 开始) (从 C++20 开始为 constexpr) |
|
basic_string& assign( basic_string&& str ) noexcept(/* see below */); |
(4) | (从 C++11 开始) (从 C++20 开始为 constexpr) |
basic_string& assign( const CharT* s, size_type count ); |
(5) | (从 C++20 开始为 constexpr) |
basic_string& assign( const CharT* s ); |
(6) | (从 C++20 开始为 constexpr) |
template< class InputIt > basic_string& assign( InputIt first, InputIt last ); |
(7) | (从 C++20 开始为 constexpr) |
basic_string& assign( std::initializer_list<CharT> ilist ); |
(8) | (从 C++11 开始) (从 C++20 开始为 constexpr) |
template< class StringViewLike > basic_string& assign( const StringViewLike& t ); |
(9) | (从 C++17 开始) (从 C++20 开始为 constexpr) |
template< class StringViewLike > basic_string& assign( const StringViewLike& t, |
(10) | (从 C++17 开始) (从 C++20 开始为 constexpr) |
替换字符串的内容。
1) 用 count 个字符 ch 的副本替换内容。
2) 用 str 的副本替换内容。等效于 *this = str;. 特别是,可能会发生分配器传播。(从 C++11 开始)
3) 用 str 的子字符串
[
pos,
pos + count)
替换内容。如果请求的子字符串超出字符串的末尾,或者如果 count == npos,则结果子字符串为 [
pos,
str.size())
。如果 pos > str.size(),则抛出 std::out_of_range。4) 用 str 的内容使用移动语义替换内容。等效于 *this = std::move(str)。特别是,可能会发生分配器传播。
5) 用范围
[
s,
s + count)
中的字符的副本替换内容。此范围可以包含空字符。6) 用 s 指向的以空字符结尾的字符字符串的内容替换内容。字符串的长度由第一个空字符使用 Traits::length(s) 确定。
8) 用初始化列表 ilist 的内容替换内容。
9) 隐式将 t 转换为字符串视图 sv,就像使用 std::basic_string_view<CharT, Traits> sv = t; 一样,然后用 sv 的内容替换内容,就像使用 assign(sv.data(), sv.size()) 一样。
此重载仅当 std::is_convertible_v<const StringViewLike&,
std::basic_string_view<CharT, Traits>> 为 true 且 std::is_convertible_v<const StringViewLike&, const CharT*> 为 false 时参与重载解析。
std::basic_string_view<CharT, Traits>> 为 true 且 std::is_convertible_v<const StringViewLike&, const CharT*> 为 false 时参与重载解析。
10) 隐式将 t 转换为字符串视图 sv,就像使用 std::basic_string_view<CharT, Traits> sv = t; 一样,然后用来自 sv 的子视图
[
pos,
pos + count)
中的字符替换内容。如果请求的子视图超过了 sv 的末尾,或者如果 count == npos,则结果子视图为 [
pos,
sv.size())
。如果 pos > sv.size(),则抛出 std::out_of_range。 此重载仅当 std::is_convertible_v<const StringViewLike&,
std::basic_string_view<CharT, Traits>> 为 true 且 std::is_convertible_v<const StringViewLike&, const CharT*> 为 false 时参与重载解析。
std::basic_string_view<CharT, Traits>> 为 true 且 std::is_convertible_v<const StringViewLike&, const CharT*> 为 false 时参与重载解析。
内容 |
[edit] 参数
count | - | 结果字符串的大小 |
pos | - | 要获取的第一个字符的索引 |
ch | - | 用于初始化字符串字符的值 |
first, last | - | 要复制字符的范围 |
str | - | 用作源字符串来初始化字符 |
s | - | 指向字符字符串的指针,用作源字符串来初始化字符串 |
ilist | - | std::initializer_list 用于初始化字符串的字符 |
t | - | 对象(可转换为 std::basic_string_view)用于初始化字符串的字符 |
类型要求 | ||
-InputIt 必须满足 LegacyInputIterator 的要求。 |
[edit] 返回值
*this
[edit] 复杂度
1) 与 count 成线性关系。
2) 与 str 的大小成线性关系。
3) 与 count 成线性关系。
4) 常数。如果提供了 alloc 且 alloc != other.get_allocator(),则为线性。
5) 与 count 成线性关系。
6) 与 s 的大小成线性关系。
7) 与 first 和 last 之间的距离成线性关系。
8) 与 ilist 的大小成线性关系。
9) 与 t 的大小成线性关系。
[edit] 异常
4)
noexcept 规范:
noexcept(std::allocator_traits<Allocator>::
propagate_on_container_move_assignment::value ||
如果操作会导致 size
() >
max_size
(),则抛出 std::length_error。
如果由于任何原因抛出异常,则此函数无效(强异常安全保证)。
[edit] 示例
运行此代码
#include <iostream> #include <iterator> #include <string> int main() { std::string s; // assign(size_type count, CharT ch) s.assign(4, '='); std::cout << s << '\n'; // "====" std::string const c("Exemplary"); // assign(const basic_string& str) s.assign(c); std::cout << c << " == " << s << '\n'; // "Exemplary == Exemplary" // assign(const basic_string& str, size_type pos, size_type count) s.assign(c, 0, c.length() - 1); std::cout << s << '\n'; // "Exemplar"; // assign(basic_string&& str) s.assign(std::string("C++ by ") + "example"); std::cout << s << '\n'; // "C++ by example" // assign(const CharT* s, size_type count) s.assign("C-style string", 7); std::cout << s << '\n'; // "C-style" // assign(const CharT* s) s.assign("C-style\0string"); std::cout << s << '\n'; // "C-style" char mutable_c_str[] = "C-style string"; // assign(InputIt first, InputIt last) s.assign(std::begin(mutable_c_str), std::end(mutable_c_str) - 1); std::cout << s << '\n'; // "C-style string" // assign(std::initializer_list<CharT> ilist) s.assign({'C', '-', 's', 't', 'y', 'l', 'e'}); std::cout << s << '\n'; // "C-style" }
输出
==== Exemplary == Exemplary Exemplar C++ by example C-style C-style C-style string C-style
[edit] 缺陷报告
以下行为变更缺陷报告已追溯应用于以前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 847 | C++98 | 没有异常安全保证 | 添加了强异常安全保证 |
LWG 2063 | C++11 | 非规范性说明指出 swap 是 移动赋值的有效实现 |
更正为需要移动赋值 |
LWG 2579 | C++11 | assign(const basic_string&) 未传播分配器 |
在需要时传播分配器 |
LWG 2946 | C++17 | 重载 (9) 在某些情况下会导致歧义 | 通过将其设置为模板来避免 |
[edit] 参见
(C++23) |
将一系列字符赋值给字符串 (公有成员函数) |
构造 basic_string (公有成员函数) | |
将值赋值给字符串 (公有成员函数) |