Namespaces
Variants

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

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
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 [ first , last ) avec des valeurs séquentiellement croissantes, 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;
...

Table des matières

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)
assigne une certaine valeur à une plage d'éléments
(objet fonction algorithme)
assigne les résultats d'appels successifs de fonction à chaque élément d'une plage
(modèle de fonction)
sauvegarde le résultat d'une fonction dans une plage
(objet fonction algorithme)
une view 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)
(C++11)
remplit une plage avec des incréments successifs de la valeur de départ
(modèle de fonction)