std::fill în C++

Atribuie aceeași valoare tuturor elementelor unui interval (fill) sau primelor n elemente (fill_n).

Sintaxă
void fill(ForwardIt first, ForwardIt last, const T& valoare);
OutputIt fill_n(OutputIt first, Size n, const T& valoare);

Ce face std::fill

std::fill scrie valoarea în fiecare poziție din [first, last). std::fill_n scrie valoarea în n poziții consecutive începând de la first și returnează iteratorul de după ultima.

Sunt utile pentru resetarea unui tablou sau pentru inițializarea unei porțiuni dintr-un vector deja creat.

Parametri

Parametru Descriere
first, last Intervalul de completat (pentru fill).
n Numărul de elemente (pentru fill_n).
valoare Valoarea scrisă.

Ce returnează

fill: nimic. fill_n: iterator după ultimul element scris.

Exemple

Exemplul 1: Resetarea unei table de joc

#include <algorithm>
#include <array>
#include <print>
#include <string_view>

int main() {
    std::array<char, 9> tabla{'X', 'O', 'X', ' ', 'O', ' ', ' ', 'X', ' '};

    std::fill(tabla.begin(), tabla.end(), '.');
    std::println("{}", std::string_view(tabla.data(), tabla.size()));
}

Rezultat

.........

Exemplul 2: Primele locuri ocupate

#include <algorithm>
#include <print>
#include <vector>

int main() {
    std::vector<int> locuri(8, 0);

    std::fill_n(locuri.begin(), 3, 1);
    std::ranges::fill(locuri.begin() + 6, locuri.end(), 2);
    std::println("{}", locuri);
}

Rezultat

[1, 1, 1, 0, 0, 0, 2, 2]

Greșeli frecvente

  • Apelezi fill_n(v.begin(), 10, x) pe un vector cu mai puțin de 10 elemente. Funcția nu verifică dimensiunea.
  • Folosești memset pentru a pune valoarea 1 într-un tablou de int: memset lucrează pe octeți și rezultatul este 16843009. std::fill lucrează pe elemente.

Comenzi înrudite

  • std::generate: Completează un interval cu valorile returnate de apeluri succesive ale unei funcții.
  • std::iota: Completează un interval cu valori consecutive: valoare, valoare + 1, valoare + 2…
  • std::copy: Copiază elementele unui interval (copy) sau primele n elemente (copy_n) la o destinație.