跳到主要内容

std::string assign() 方法

// (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) 用字符 chcount 个副本替换内容。

  • (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>>truestd::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>>truestd::is_convertible_v<const StringViewLike&, const CharT*>false 时参与重载决议。

参数

  • count - 结果字符串的大小
  • pos - 要获取的第一个字符的索引
  • ch - 用于初始化字符串字符的值
  • first, last - 要从中复制字符的范围
  • str - 用作源字符串来初始化字符
  • s - 指向字符字符串的指针,用作源以初始化字符串
  • ilist - 用于初始化字符串字符的std::initializer_list
  • t - 对象(可转换为std::basic_string_view),用于初始化字符串的字符

类型要求

返回值

*this

复杂度

  • (1) count 的线性复杂度 - O(count)
  • (2) str 大小的线性复杂度 - O(str.size())
  • (3) count 的线性复杂度 - O(count)
  • (4)
    常数复杂度 - O(1)。如果给定 allocalloc != 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())

异常

  • (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

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

示例

Main.cpp
#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
本文源自此 CppReference 页面。它可能经过修改以进行改进或满足编辑偏好。单击“编辑此页面”查看本文档的所有更改。
悬停查看原始许可证。

std::string assign() 方法

// (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) 用字符 chcount 个副本替换内容。

  • (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>>truestd::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>>truestd::is_convertible_v<const StringViewLike&, const CharT*>false 时参与重载决议。

参数

  • count - 结果字符串的大小
  • pos - 要获取的第一个字符的索引
  • ch - 用于初始化字符串字符的值
  • first, last - 要从中复制字符的范围
  • str - 用作源字符串来初始化字符
  • s - 指向字符字符串的指针,用作源以初始化字符串
  • ilist - 用于初始化字符串字符的std::initializer_list
  • t - 对象(可转换为std::basic_string_view),用于初始化字符串的字符

类型要求

返回值

*this

复杂度

  • (1) count 的线性复杂度 - O(count)
  • (2) str 大小的线性复杂度 - O(str.size())
  • (3) count 的线性复杂度 - O(count)
  • (4)
    常数复杂度 - O(1)。如果给定 allocalloc != 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())

异常

  • (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

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

示例

Main.cpp
#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
本文源自此 CppReference 页面。它可能经过修改以进行改进或满足编辑偏好。单击“编辑此页面”查看本文档的所有更改。
悬停查看原始许可证。