Пространства имён
Варианты
Действия

std::basic_string<CharT,Traits,Allocator>::assign

Материал из cppreference.com
 
 
 
std::basic_string
Функции-элементы
Доступ к элементам
Итераторы
Ёмкость
Операции
Поиск
Константы
Правила вывода (C++17)
Функции, не являющиеся элементами
Ввод/Вывод
Сравнение
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Числовые преобразования
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Вспомогательные классы
 
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
(1)
basic_string& assign( size_type count, CharT ch );
(до C++20)
constexpr basic_string& assign( size_type count, CharT ch );
(начиная с C++20)
(2)
basic_string& assign( const basic_string& str );
(до C++20)
constexpr basic_string& assign( const basic_string& str );
(начиная с C++20)
(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( const basic_string& str, size_type pos, size_type count = npos);
(начиная с C++20)
(4)
basic_string& assign( basic_string&& str ) noexcept(/* смотрите ниже */);
(начиная с C++11)
(до C++20)
constexpr basic_string& assign( basic_string&& str ) noexcept(/* смотрите ниже */);
(начиная с C++20)
(5)
basic_string& assign( const CharT* s, size_type count );
(до C++20)
constexpr basic_string& assign( const CharT* s, size_type count );
(начиная с C++20)
(6)
basic_string& assign( const CharT* s );
(до C++20)
constexpr basic_string& assign( const CharT* s );
(начиная с C++20)
(7)
template< class InputIt > basic_string& assign( InputIt first, InputIt last );
(до C++20)
template< class InputIt > constexpr basic_string& assign( InputIt first, InputIt last );
(начиная с C++20)
(8)
basic_string& assign( std::initializer_list<CharT> ilist );
(начиная с C++11)
(до C++20)
constexpr basic_string& assign( std::initializer_list<CharT> ilist );
(начиная с C++20)
(9)
template< class StringViewLike > basic_string& assign( const StringViewLike& t );
(начиная с C++17)
(до C++20)
template< class StringViewLike > constexpr basic_string& assign( const StringViewLike& t );
(начиная с C++20)
(10)
template< class StringViewLike > basic_string& assign( const StringViewLike& t, size_type pos, size_type count = npos);
(начиная с C++17)
(до C++20)
template< class StringViewLike > constexpr basic_string& assign( const StringViewLike& t, size_type pos, size_type count = npos);
(начиная с C++20)

Заменяет содержимое строки.

1) Заменяет содержимое count копиями символа ch.
2) Заменяет содержимое копией str. Эквивалентно *this = str;. В частности, может иметь место распространение аллокатора. (начиная с C++11)
3) Заменяет содержимое подстрокой [pospos + count) из str. Если запрошенная подстрока выходит за конец строки или если count == npos, результирующей подстрокой будет [posstr.size()). Если pos > str.size(), генерируется std::out_of_range.
4) Заменяет содержимое на содержимое str, используя семантику перемещения. Эквивалентно *this = std::move(str). В частности, может иметь место распространение аллокатора.
5) Заменяет содержимое копиями символов в диапазоне [ss + count). Этот диапазон может содержать нулевые символы.
6) Заменяет содержимое строкой символов с нулевым завершением, на которую указывает s. Длина строки определяется по первому нулевому символу с помощью Traits::length(s).
7) Заменяет содержимое копиями символов в диапазоне [firstlast). Эта перегрузка не участвует в разрешении перегрузки, если 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;, затем заменяет содержимое символами из подпредставления [pospos + count) из sv. Если запрошенное подпредставление продолжается после конца sv или если count == npos, результирующее подпредставление будет [possv.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) для инициализации символов строки
Требования к типам
-
InputIt должен соответствовать требованиям LegacyInputIterator.

Возвращаемое значение

*this

Сложность

1) Линейная по count.
2) Линейная по размеру str.
3) Линейная по count.
4) Константная. Если задан alloc и alloc != other.get_allocator(), то линейная.
5) Линейная по count.
6) Линейная по размеру s.
7) Линейная по расстоянию между first и last.
8) Линейная по размеру ilist.
9) Линейная по размеру t.

Исключения

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("Образец");
    // assign(const basic_string& str)
    s.assign(c);
    std::cout << c << " == " << s << '\n'; // "Образец == Образец"
    
    // assign(const basic_string& str, size_type pos, size_type count)
    s.assign(c, 0, c.length() - 1);
    std::cout << s << '\n'; // "Образе";
    
    // assign(basic_string&& str)
    s.assign(std::string("С++ на ") + "примере");
    std::cout << s << '\n'; // "С++ на примере"
    
    // assign(const CharT* s, size_type count)
    s.assign("строка в стиле C", 7);
    std::cout << s << '\n'; // "строка "
    
    // assign(const CharT* s)
    s.assign("строка\0в стиле С");
    std::cout << s << '\n'; // "строка"
    
    char mutable_c_str[] = "строка в стиле С";
    // assign(InputIt first, InputIt last)
    s.assign(std::begin(mutable_c_str), std::end(mutable_c_str) - 1);
    std::cout << s << '\n'; // "строка в стиле С"
    
    // assign(std::initializer_list<CharT> ilist)
    s.assign({'C', '-', 's', 't', 'y', 'l', 'e'});
    std::cout << s << '\n'; // "C-style"
}

Вывод:

====
Образец == Образец
Образе
С++ на примере
строка
строка
строка в стиле С
C-style

Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 847 C++98 не было гарантии безопасности исключений добавлена надёжная гарантия безопасности
исключений
LWG 2063 C++11 в ненормативном примечании указано, что swap является
допустимой реализацией присваивания перемещением
исправлено требование присваивания
перемещением
LWG 2579 C++11 assign(const basic_string&) не распространяла аллокаторы сделано для распространения аллокаторов,
если это необходимо
LWG 2946 C++17 перегрузка (9) в некоторых случаях вызывала двусмысленность исключено, сделав его шаблоном

Смотрите также

присваивает диапазон символов строке
(public функция-элемент) [править]
создаёт basic_string
(public функция-элемент) [править]
присваивает значения строке
(public функция-элемент) [править]