Spec-Zone.ru › C++

std::inplace_vector<T,N>::assign

constexpr void assign( size_type count, const T& value );
(1) (начиная с C++26)
template< class InputIt >
constexpr void assign( InputIt first, InputIt last );
(2) (начиная с C++26)
constexpr void assign( std::initializer_list<T> ilist );
(3) (начиная с C++26)

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

1) Заменяет содержимое count копиями значения value.
2) Заменяет содержимое копиями элементов диапазона [first, last).

Если любой из аргументов является итератором в *this, поведение не определено.
Эта перегрузка участвует в разрешении перегрузки только в том случае, если InputIt удовлетворяет требованиям LegacyInputIterator.

Каждый итератор в диапазоне [first, last) разыменовывается ровно один раз.
3) Заменяет содержимое элементами из ilist.

Параметры

count - новый размер контейнера
value - значение для инициализации элементов контейнера
first, last - пара итераторов, определяющая исходный диапазон копируемых элементов
ilist - список инициализации, из которого копируются значения

Сложность

1) Линейная относительно count.
2) Линейная относительно расстояния между first и last.
3) Линейная относительно ilist.size().

Исключения

1) std::bad_alloc, если count > capacity().
2) std::bad_alloc, если std::ranges::distance(first, last) > capacity().
3) std::bad_alloc, если ilist.size() > capacity().
1-3) Любое исключение, возникающее при инициализации добавляемых элементов.

Пример

В следующем коде assign используется для добавления нескольких символов в std::inplace_vector<char,5>:

#include <inplace_vector>
#include <iterator>
#include <new>
#include <print>

int main()
{
    std::inplace_vector<char, 5> chars;
    
    chars.assign(4, 'a'); // overload (1)
    std::println("{}", chars);
    
    const char extra[3]{'a', 'b', 'c'};
    chars.assign(std::cbegin(extra), std::cend(extra)); // overload (2)
    std::println("{}", chars);
    
    chars.assign({'C', '+', '+', '2', '6'}); // overload (3)
    std::println("{}", chars);
    
    try
    {
        chars.assign(8, 'x'); // throws: count > chars.capacity()
    }
    catch(const std::bad_alloc&) { std::println("std::bad_alloc #1"); }
    
    try
    {
        const char bad[8]{'?'}; // ranges::distance(bad) > chars.capacity()
        chars.assign(std::cbegin(bad), std::cend(bad)); // throws
    }
    catch(const std::bad_alloc&) { std::println("std::bad_alloc #2"); }
    
    try
    {
        const auto l = {'1', '2', '3', '4', '5', '6'};
        chars.assign(l); // throws: l.size() > chars.capacity()
    }
    catch(const std::bad_alloc&) { std::println("std::bad_alloc #3"); }
}

Вывод:

['a', 'a', 'a', 'a']
['a', 'b', 'c']
['C', '+', '+', '2', '6']
std::bad_alloc #1
std::bad_alloc #2
std::bad_alloc #3

См. также

assign_range
присваивает контейнеру диапазон значений
(открытая функция-член)
operator=
присваивает значения контейнеру
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/inplace_vector/assign

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API