Namespaces
Variants

std::forward_list<T,Allocator>:: operator=

From cppreference.net

forward_list & operator = ( const forward_list & other ) ;
(1) (depuis C++11)
(constexpr depuis C++26)
(2)
forward_list & operator = ( forward_list && other ) ;
(depuis C++11)
(jusqu'à C++17)
forward_list & operator = ( forward_list && other )
noexcept ( /* voir ci-dessous */ ) ;
(depuis C++17)
(constexpr depuis C++26)
forward_list & operator = ( std:: initializer_list < value_type > ilist ) ;
(3) (depuis C++11)
(constexpr depuis C++26)

Remplace le contenu du conteneur.

Soit traits le std:: allocator_traits < allocator_type > :

1) Opérateur d'affectation par copie. Remplace le contenu par une copie du contenu de other .
Si traits :: propagate_on_container_copy_assignment :: value est true , l'allocateur de * this est remplacé par une copie de other . Si l'allocateur de * this après l'affectation serait différent de son ancienne valeur, l'ancien allocateur est utilisé pour désallouer la mémoire, puis le nouvel allocateur est utilisé pour l'allouer avant de copier les éléments. Sinon, la mémoire appartenant à * this peut être réutilisée si possible. Dans tous les cas, les éléments appartenant initialement à * this peuvent être soit détruits soit remplacés par une affectation-copie élément par élément.
2) Opérateur d'affectation par déplacement. Remplace le contenu par celui de other en utilisant la sémantique de déplacement (c'est-à-dire que les données dans other sont déplacées de other vers ce conteneur). other se trouve dans un état valide mais non spécifié par la suite.
Si traits :: propagate_on_container_move_assignment :: value est true , l'allocateur de * this est remplacé par une copie de celui de other . S'il est false et que les allocateurs de * this et other ne sont pas égaux, * this ne peut pas prendre possession de la mémoire appartenant à other et doit assigner par déplacement chaque élément individuellement, en allouant de la mémoire supplémentaire en utilisant son propre allocateur si nécessaire. Dans tous les cas, tous les éléments appartenant initialement à * this sont soit détruits soit remplacés par une assignation par déplacement élément par élément.
3) Remplace le contenu par celui identifié par la liste d'initialisation ilist .

Table des matières

Paramètres

other - autre conteneur à utiliser comme source de données
ilist - liste d'initialisation à utiliser comme source de données

Valeur de retour

* this

Complexité

1) Linéaire dans la taille de * this et other .
2) Linéaire dans la taille de * this sauf si les allocateurs ne sont pas égaux et ne se propagent pas, auquel cas linéaire dans la taille de * this et other .
3) Linéaire dans la taille de * this et ilist .

Exceptions

2)
noexcept spécification :
noexcept ( std:: allocator_traits < Allocator > :: is_always_equal :: value )
(depuis C++17)

Notes

Après l'affectation par déplacement du conteneur (surcharge ( 2 ) ), sauf si l'affectation par déplacement élément par élément est forcée par des allocateurs incompatibles, les références, pointeurs et itérateurs (à l'exception de l'itérateur de fin) vers other restent valides, mais se réfèrent aux éléments qui se trouvent désormais dans * this . La norme actuelle garantit ceci via l'énoncé général dans [container.reqmts]/67 , et une garantie plus directe est à l'étude via LWG issue 2321 .

Exemple

Le code suivant utilise operator = pour assigner une std::forward_list à une autre :

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <forward_list>
void print(const auto comment, const auto& container)
{
    auto size = std::ranges::distance(container);
    std::cout << comment << "{ ";
    for (const auto& element : container)
        std::cout << element << (--size ? ", " : " ");
    std::cout << "}\n";
}
int main()
{
    std::forward_list<int> x{1, 2, 3}, y, z;
    const auto w = {4, 5, 6, 7};
    std::cout << "Initially:\n";
    print("x = ", x);
    print("y = ", y);
    print("z = ", z);
    std::cout << "Copy assignment copies data from x to y:\n";
    y = x;
    print("x = ", x);
    print("y = ", y);
    std::cout << "Move assignment moves data from x to z, modifying both x and z:\n";
    z = std::move(x);
    print("x = ", x);
    print("z = ", z);
    std::cout << "Assignment of initializer_list w to z:\n";
    z = w;
    print("w = ", w);
    print("z = ", z);
}

Sortie :

Initially:
x = { 1, 2, 3 }
y = { }
z = { }
Copy assignment copies data from x to y:
x = { 1, 2, 3 }
y = { 1, 2, 3 }
Move assignment moves data from x to z, modifying both x and z:
x = { }
z = { 1, 2, 3 }
Assignment of initializer_list w to z:
w = { 4, 5, 6, 7 }
z = { 4, 5, 6, 7 }

Voir aussi

construit le forward_list
(fonction membre publique)
assigne des valeurs au conteneur
(fonction membre publique)