Namespaces
Variants

std::ranges::iota, std::ranges::iota_result

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les ranges (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des plages partitionnées)
Opérations d'ensemble (sur des plages triées)
Opérations de fusion (sur des plages triées)
Opérations sur les tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modificatrices
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des plages triées)
       
       
Opérations d'ensemble (sur des plages triées)
Opérations sur les tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
 
Défini dans l'en-tête <numeric>
Signature d'appel
template< std::input_or_output_iterator O, std::sentinel_for<O> S,
          std::weakly_incrementable T >
requires std::indirectly_writable<O, const T&>
constexpr iota_result<O, T>
    iota( O first, S last, T value );
(1) (depuis C++23)
template< std::weakly_incrementable T, ranges::output_range<const T&> R >
constexpr iota_result<ranges::borrowed_iterator_t<R>, T>
    iota( R&& r, T value );
(2) (depuis C++23)
Types auxiliaires
template< class O, class T >
using iota_result = ranges::out_value_result<O, T>;
(3) (depuis C++23)

Remplit la plage [firstlast) avec des valeurs croissantes séquentiellement, en commençant par value et en évaluant de manière répétée ++value.

Opération équivalente :

*(first)     = value;
*(first + 1) = ++value;
*(first + 2) = ++value;
*(first + 3) = ++value;
...

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage d'éléments à remplir avec des valeurs séquentiellement croissantes commençant par value
value - valeur initiale à stocker ; l'expression ++ value doit être bien formée

Valeur de retour

{ dernier, valeur + ranges:: distance ( premier, dernier ) }

Complexité

Exactement last - first incréments et assignations.

Implémentation possible

struct iota_fn
{
    template<std::input_or_output_iterator O, std::sentinel_for<O> S,
            std::weakly_incrementable T>
    requires std::indirectly_writable<O, const T&>
    constexpr iota_result<O, T> operator()(O first, S last, T value) const
    {
        while (first != last)
        {
            *first = as_const(value);
            ++first;
            ++value;
        }
        return {std::move(first), std::move(value)};
    }
    template<std::weakly_incrementable T, std::ranges::output_range<const T&> R>
    constexpr iota_result<std::ranges::borrowed_iterator_t<R>, T>
    operator()(R&& r, T value) const
    {
        return (*this)(std::ranges::begin(r), std::ranges::end(r), std::move(value));
    }
};
inline constexpr iota_fn iota;

Notes

La fonction est nommée d'après la fonction entière du langage de programmation APL .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_ranges_iota 202202L (C++23) std::ranges::iota

Exemple

Utilise un vector d'itérateurs ( std:: vector < std:: list < T > :: iterator > ) comme proxy pour mélanger les éléments de la std::list , car ranges::shuffle ne peut pas être appliqué directement à la std::list .

#include <algorithm>
#include <functional>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>
template <typename Proj = std::identity>
void println(auto comment, std::ranges::input_range auto&& range, Proj proj = {})
{
    for (std::cout << comment; auto const &element : range)
        std::cout << proj(element) << ' ';
    std::cout << '\n';
}
int main()
{
    std::list<int> list(8);
    // Remplir la liste avec des valeurs ascendantes : 0, 1, 2, ..., 7
    std::ranges::iota(list, 0);
    println("List: ", list);
    // Un vecteur d'itérateurs (voir le commentaire de l'Exemple)
    std::vector<std::list<int>::iterator> vec(list.size());
    // Remplir avec des itérateurs vers les éléments consécutifs de la liste
    std::ranges::iota(vec.begin(), vec.end(), list.begin());
    std::ranges::shuffle(vec, std::mt19937 {std::random_device {}()});
    println("Liste vue via le vecteur: ", vec, [](auto it) { return *it; });
}

Sortie possible :

List: 0 1 2 3 4 5 6 7
List viewed via vector: 5 7 6 0 1 3 4 2

Voir aussi

assigne par copie la valeur donnée à chaque élément d'une plage
(modèle de fonction & objet fonction d'algorithme)
assigne une certaine valeur à une plage d'éléments
(objet fonction d'algorithme)
assigne les résultats d'appels successifs de fonction à chaque élément d'une plage
(modèle de fonction & objet fonction d'algorithme)
enregistre le résultat d'une fonction dans une plage
(objet fonction d'algorithme)
une vue constituée d'une séquence générée en incrémentant répétitivement une valeur initiale
(modèle de classe) (objet point de personnalisation)
une vue qui génère une séquence de valeurs croissantes de 0 à n
(objet point de personnalisation)
(C++11)
remplit une plage avec des incréments successifs de la valeur de départ
(modèle de fonction)