std::basic_string<CharT,Traits,Allocator>::assign
来自 cppreference.cn
< cpp | string | basic string
basic_string& assign( const basic_string& str ); |
(1) | (constexpr since C++20) |
basic_string& assign( basic_string&& str ) noexcept(/* see below */); |
(2) | (since C++11) (constexpr since C++20) |
basic_string& assign( size_type count, CharT ch ); |
(3) | (constexpr since C++20) |
basic_string& assign( const CharT* s, size_type count ); |
(4) | (constexpr since C++20) |
basic_string& assign( const CharT* s ); |
(5) | (constexpr since C++20) |
template< class SV > basic_string& assign( const SV& t ); |
(6) | (since C++17) (constexpr since C++20) |
template< class SV > basic_string& assign( const SV& t, |
(7) | (since C++17) (constexpr since C++20) |
(8) | ||
basic_string& assign( const basic_string& str, size_type pos, size_type count ); |
(until C++14) | |
basic_string& assign( const basic_string& str, size_type pos, size_type count = npos); |
(since C++14) (constexpr since C++20) |
|
template< class InputIt > basic_string& assign( InputIt first, InputIt last ); |
(9) | (constexpr since C++20) |
basic_string& assign( std::initializer_list<CharT> ilist ); |
(10) | (since C++11) (constexpr since C++20) |
替换字符串的内容。
1) 等效于 return *this = str;。
2) 等效于 return *this = std::move(str);。
3) 用 count 个字符 ch 的副本替换内容。
等效于 clear(); resize(n, c); return *this;。
4) 用范围
[
s,
s + count)
中的字符副本替换内容。 如果
[
s,
s + count)
不是有效的范围,则行为未定义。5) 等效于 return assign(s, Traits::length(s));。
6,7) 用从 t 构造的字符串视图 sv 中的字符替换内容。
仅当满足以下所有条件时,这些重载才参与重载解析
- std::is_convertible_v<const SV&, std::basic_string_view<CharT, Traits>> 是 true。
- std::is_convertible_v<const SV&, const CharT*> 是 false。
6) 等效于 std::basic_string_view<CharT, Traits> sv = t;
return assign(sv.data(), sv.size());。
return assign(sv.data(), sv.size());。
7) 等效于 std::basic_string_view<CharT, Traits> sv = t;
return assign(sv.substr(pos, count));。
return assign(sv.substr(pos, count));。
8) 用 str 中的字符替换内容。
等效于 return assign(std::basic_string_view<CharT, Traits>
(str).substr(pos, count));。 |
(since C++20) |
9) 等效于 return assign(basic_string(first, last, get_allocator()));。
此重载仅在 |
(since C++11) |
10) 等效于 return assign(ilist.begin(), ilist.size());。
内容 |
[edit] 参数
str | - | 用作源字符串以初始化字符 |
count | - | 结果字符串的大小 |
ch | - | 用于初始化字符串字符的值 |
s | - | 指向字符字符串的指针,用作源字符串以初始化字符串 |
t | - | 对象(可转换为 std::basic_string_view),用于初始化字符串的字符 |
pos | - | 要获取的第一个字符的索引 |
first, last | - | 从中复制字符的范围 |
ilist | - | std::initializer_list,用于初始化字符串的字符 |
[edit] 返回值
*this
[edit] 异常
2)
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 | 非规范性注释指出重载 (2) 可以通过交换来实现 |
更正为要求移动赋值 |
LWG 2250 | C++98 | 重载 (8) 的行为是 如果 pos > str.size() 为 true,则未定义 |
在这种情况下始终抛出异常 |
LWG 2579 | C++98 | 重载 (1) 和复制赋值 运算符具有不同的效果 |
它们具有相同的效果 |
LWG 2946 | C++17 | 重载 (6) 在某些情况下引起歧义 | 通过使其成为模板来避免 |
[edit] 参见
(C++23) |
将字符范围赋值给字符串 (公共成员函数) |
构造一个 basic_string (公共成员函数) | |
为字符串赋值 (公共成员函数) |