std::string assign() 方法
- 自 C++20 起
- 自 C++17 起
- 自 C++11 起
- 直到 C++11
// (1) Non const version only
constexpr basic_string& assign( size_type count, CharT ch );
// (2) Non const version only
constexpr basic_string& assign( const basic_string& str );
// (3) Non const version only
constexpr basic_string& assign( const basic_string& str,
size_type pos, size_type count = npos);
// (4) Non const version only
constexpr basic_string& assign( basic_string&& str ) noexcept(/* see below */);
// (5) Non const version only
constexpr basic_string& assign( const CharT* s, size_type count );
// (6) Non const version only
constexpr basic_string& assign( const CharT* s );
// (7) Non const version only
template< class InputIt >
constexpr basic_string& assign( InputIt first, InputIt last );
// (8) Non const version only
constexpr basic_string& assign( std::initializer_list<CharT> ilist );
// (9) Non const version only
template < class StringViewLike >
constexpr basic_string& assign( const StringViewLike& t );
// (10) Non const version only
template < class StringViewLike >
constexpr basic_string& assign( const StringViewLike& t,
size_type pos, size_type count = npos);
// (1) Non const version only
basic_string& assign( size_type count, CharT ch );
// (2) Non const version only
basic_string& assign( const basic_string& str );
// (3) Non const version only
basic_string& assign( const basic_string& str,
size_type pos, size_type count = npos);
// (4) Non const version only
basic_string& assign( basic_string&& str ) noexcept(/* see below */);
// (5) Non const version only
basic_string& assign( const CharT* s, size_type count );
// (6) Non const version only
basic_string& assign( const CharT* s );
// (7) Non const version only
template< class InputIt >
basic_string& assign( InputIt first, InputIt last );
// (8) Non const version only
basic_string& assign( std::initializer_list<CharT> ilist );
// (9) Non const version only
template < class StringViewLike >
basic_string& assign( const StringViewLike& t );
// (10) Non const version only
template < class StringViewLike >
basic_string& assign( const StringViewLike& t,
size_type pos, size_type count = npos);
// (1) Non const version only
basic_string& assign( size_type count, CharT ch );
// (2) Non const version only
basic_string& assign( const basic_string& str );
// (3) Non const version only
basic_string& assign( const basic_string& str,
size_type pos, size_type count );
// (4) Non const version only
basic_string& assign( basic_string&& str );
// (5) Non const version only
basic_string& assign( const CharT* s, size_type count );
// (6) Non const version only
basic_string& assign( const CharT* s );
// (7) Non const version only
template< class InputIt >
basic_string& assign( InputIt first, InputIt last );
// (8) Non const version only
basic_string& assign( std::initializer_list<CharT> ilist );
// (1) Non const version only
basic_string& assign( size_type count, CharT ch );
// (2) Non const version only
basic_string& assign( const basic_string& str );
// (3) Non const version only
basic_string& assign( const basic_string& str,
size_type pos, size_type count );
// (5) Non const version only
basic_string& assign( const CharT* s, size_type count );
// (6) Non const version only
basic_string& assign( const CharT* s );
// (7) Non const version only
template< class InputIt >
basic_string& assign( InputIt first, InputIt last );
替换字符串内容。
-
(1) 用字符
ch
的count
个副本替换内容。 -
(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)
的第一个空字符决定。 -
(7) 用范围 [ first, last ) 中的字符副本替换内容。 如果
InputIt
不满足LegacyInputIterator
,则此重载不参与重载决议。 (自 C++11 起) -
(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
时参与重载决议。 -
(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
时参与重载决议。
参数
count
- 结果字符串的大小pos
- 要获取的第一个字符的索引ch
- 用于初始化字符串字符的值first
,last
- 要从中复制字符的范围str
- 用作源字符串来初始化字符s
- 指向字符字符串的指针,用作源以初始化字符串ilist
- 用于初始化字符串字符的std::initializer_list
t
- 对象(可转换为std::basic_string_view
),用于初始化字符串的字符
类型要求
- (7) -
InputIt
必须满足LegacyInputIterator
的要求。
返回值
*this
复杂度
- (1)
count
的线性复杂度 - O(count)。 - (2)
str
大小的线性复杂度 - O(str.size())。 - (3)
count
的线性复杂度 - O(count)。 - (4)
常数复杂度 - O(1)。如果给定alloc
且alloc != other.get_allocator()
,则为大小的线性复杂度 - O(size())。 - (5)
count
的线性复杂度 - O(count)。 - (6)
s
大小的线性复杂度 - O(s.size())。 - (7) 距离 [ first, last ) 的线性复杂度 - O(std::distance(first, last))。
- (8)
ilist
大小的线性复杂度 - O(ilist.size())。
异常
- 自 C++17 起
- (4) noexcept 规范
noexcept(std::allocator_traits<Allocator>::propagate_on_container_move_assignment::value
|| std::allocator_traits<Allocator>::is_always_equal::value)
如果操作导致 size() > max_size()
,则抛出std::length_error
。
示例
#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(basic_string const& str)
s.assign(c);
std::cout << c << " == " << s <<'\n'; // "Exemplary == Exemplary"
// assign(basic_string const& 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(charT const* s, size_type count)
s.assign("C-style string", 7);
std::cout << s << '\n'; // "C-style"
// assign(charT const* 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