Namespaces
Variants

std::fill_n

Von de.cppreference.net
 
 
Algorithmen-Bibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht-modifizierende Sequenzoperationen    
Batch-Operationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Swap-Operationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Reihenfolge-ändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Merge-Operationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert in Header <algorithm>
template< class OutputIt, class Size, class T >
OutputIt fill_n( OutputIt first, Size count, const T& value );
(1) (bis C++26)
(constexpr seit C++20)
template< class OutputIt, class Size,
          class T = typename std::iterator_traits
                        <OutputIt>::value_type >
constexpr OutputIt fill_n( OutputIt first, Size count,
                           const T& value );
(seit C++26)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,
                  ForwardIt first, Size count, const T& value );
(2) (seit C++17)
(bis C++26)
template< class ExecutionPolicy,
          class ForwardIt, class Size,
          class T = typename std::iterator_traits
                        <OutputIt>::value_type >
ForwardIt fill_n( ExecutionPolicy&& policy,
                  ForwardIt first, Size count, const T& value );
(seit C++26)
1) Weist den angegebenen value den ersten count Elementen im Bereich zu, der bei first beginnt, falls count > 0. Tut andernfalls nichts.
2) Wie (1), aber gemäß policy ausgeführt.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks true ist:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(seit C++20)

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Programm fehlerhaft:

Parameter

first - der Anfang des Bereichs der zu modifizierenden Elemente
count - Anzahl der zu modifizierenden Elemente
value - der zuzuweisende Wert
policy - die zu verwendende Ausführungsrichtlinie
Typanforderungen
-
OutputIt muss die Anforderungen von LegacyOutputIterator erfüllen.
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.

Rückgabewert

Iterator, der auf das Element unmittelbar nach dem letzten zugewiesenen Element zeigt, falls count > 0, andernfalls first.

Komplexität

Genau std::max(0, count) Zuweisungen.

Ausnahmen

Die Überladung mit einem Template-Parameter namens ExecutionPolicy meldet Fehler wie folgt:

  • Wenn die Ausführung einer im Rahmen des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.

Mögliche Implementierung

fill_n
template<class OutputIt, class Size,
         class T = typename std::iterator_traits<OutputIt>::value_type>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{
    for (Size i = 0; i < count; i++)
        *first++ = value;
    return first;
}

Anmerkungen

Feature-Test-Makro Wert Std Funktion
__cpp_lib_algorithm_default_value_type 202403 (C++26) Listeninitialisierung für Algorithmen (1,2)

Beispiel

#include <algorithm>
#include <complex>
#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    // replace values of the first 5 elements with -1
    std::fill_n(v1.begin(), 5, -1);

    std::copy_n(v1.cbegin(), v1.size(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';

    std::vector<std::complex<double>> nums{{1, 3}, {2, 2}, {4, 8}};
    #ifdef __cpp_lib_algorithm_default_value_type
        std::fill_n(nums.begin(), 2, {4, 2});
    #else
        std::fill_n(nums.begin(), 2, std::complex<double>{4, 2});
    #endif
    std::copy_n(nums.cbegin(), nums.size(),
                std::ostream_iterator<std::complex<double>>(std::cout, " "));
    std::cout << '\n';
}

Ausgabe:

-1 -1 -1 -1 -1 5 6 7 8 9
(4,2) (4,2) (4,8)

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 283 C++98 T musste CopyAssignable sein, aber
T ist nicht immer beschreibbar nach OutputIt
stattdessen muss es beschreibbar sein
LWG 426 C++98 die Komplexitätsanforderung war „genau count
Zuweisungen“, was fehlerhaft ist, wenn count negativ ist
keine Zuweisung, wenn
count nicht positiv ist
LWG 865 C++98 die Position des ersten Elements nach
dem Füllbereich wurde nicht zurückgegeben
zurückgegeben

Siehe auch

weist den angegebenen Wert per Kopie jedem Element in einem Bereich zu
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
weist einen Wert einer Anzahl von Elementen zu
(Algorithmus-Funktionsobjekt)