Namensräume
Varianten
Aktionen

std::fill_n

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
fill_n
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
(1)
template< class OutputIt, class Size, class T >
OutputIt fill_n( OutputIt first, Size count, const T& value );
(constexpr seit C++20)
(bis C++26)
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)
(2)
template< class ExecutionPolicy,

          class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,

                  ForwardIt first, Size count, const T& value );
(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 ersten count Elementen im Bereich beginnend bei first den gegebenen Wert value zu, wenn count > 0. Tut ansonsten nichts.
2) Wie (1), wird aber gemäß policy ausgeführt.
Diese Überladung nimmt an der Überladungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt sind

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> ist true.

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> ist true.

(seit C++20)

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Programm ill-formed (wohlgeformt):

Inhalt

[bearbeiten] Parameter

first - der Anfang des Bereichs der zu ändernden Elemente
zählt - Anzahl der zu ändernden Elemente
value - der zuzuweisende Wert
policy - die Ausführungsrichtlinie, die verwendet werden soll
Typanforderungen
-
OutputIt muss die Anforderungen an LegacyOutputIterator erfüllen.
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.

[bearbeiten] Rückgabewert

Iterator hinter dem letzten zugewiesenen Element, wenn count > 0, ansonsten first.

[bearbeiten] Komplexität

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

[bearbeiten] Ausnahmen

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

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[bearbeiten] 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;
}

[bearbeiten] Hinweise

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

[bearbeiten] 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)

[bearbeiten] Fehlerberichte

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 283 C++98 T musste CopyAssignable sein, aber
T ist nicht immer nach OutputIt beschreibbar
stattdessen beschreibbar sein erforderlich
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
der Füllbereich wurde nicht zurückgegeben
zurückgegeben

[bearbeiten] Siehe auch

Weist jedem Element in einem Bereich den gegebenen Wert zu
(Funktionstempelat) [edit]
Weist einer Anzahl von Elementen einen Wert zu
(Algorithmus-Funktionsobjekt)[edit]