Použití funkcí std::fill a std::generate v C++

V moderním C++ existuje mnoho užitečných funkcí, které usnadňují práci s kontejnery a daty. Mezi ně patří i funkce std::fill a std::generate, které jsou součástí standardní knihovny <algorithm>. Tyto funkce umožňují efektivní inicializaci a naplnění kontejnerů, což je běžný úkol při práci s daty. V tomto článku si ukážeme, jak tyto funkce fungují, a uvedeme praktické příklady jejich použití.


std::fill

Funkce std::fill slouží k naplnění rozsahu (range) v kontejneru jednou konkrétní hodnotou. Je ideální, pokud chcete inicializovat všechny prvky na stejnou hodnotu.

Syntaxe:

void std::fill(ForwardIterator first, ForwardIterator last, const T& value);
  • first: Iterátor na začátek rozsahu.
  • last: Iterátor na konec rozsahu (exkluzivní).
  • value: Hodnota, kterou chcete přiřadit všem prvkům.

Příklad použití:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec(10); // Vektor s 10 prvky
    std::fill(vec.begin(), vec.end(), 42); // Naplnění všech prvků hodnotou 42

    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}

Výstup:

42 42 42 42 42 42 42 42 42 42

std::generate

Funkce std::generate umožňuje naplnit rozsah hodnotami, které jsou generovány pomocí uživatelem definované funkce nebo lambda výrazu. Tato funkce je užitečná, pokud chcete vytvořit sekvenci hodnot, která se dynamicky mění.

Syntaxe:

void std::generate(ForwardIterator first, ForwardIterator last, Generator gen);
  • first: Iterátor na začátek rozsahu.
  • last: Iterátor na konec rozsahu (exkluzivní).
  • gen: Funkce nebo lambda výraz, který generuje hodnoty.

Příklad použití:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib> // Pro rand()

int main() {
    std::vector<int> vec(10); // Vektor s 10 prvky

    // Naplnění vektoru náhodnými čísly
    std::generate(vec.begin(), vec.end(), []() { return rand() % 100; });

    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}

Výstup (například):

23 87 45 12 78 34 56 90 11 67

Rozdíly mezi std::fill a std::generate

Vlastnost std::fill std::generate
Hodnoty Používá pevně danou hodnotu. Hodnoty jsou generovány dynamicky.
Vstup Vyžaduje pouze hodnotu. Vyžaduje generátor (funkci/lambda).
Použití Pro statické inicializace. Pro dynamické sekvence.

Kombinace obou funkcí

V některých případech můžete použít obě funkce společně. Například můžete nejprve inicializovat kontejner pomocí std::fill a poté některé hodnoty přepsat pomocí std::generate.

Příklad:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec(10);
    std::fill(vec.begin(), vec.end(), 0); // Inicializace na 0

    // Přepsání prvních 5 prvků náhodnými čísly
    std::generate(vec.begin(), vec.begin() + 5, []() { return rand() % 50; });

    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}

Závěr

Funkce std::fill a std::generate jsou výkonné nástroje pro práci s kontejnery v C++. Zatímco std::fill je ideální pro jednoduché inicializace, std::generate poskytuje flexibilitu při vytváření dynamických sekvencí. Jejich správné použití může výrazně zjednodušit a zpřehlednit váš kód. Pokud pracujete s daty, určitě stojí za to tyto funkce zařadit do svého arzenálu.

ai (1) architekt (1) Bash (2) bitwig (2) bitwig6 (1) c++ (54) cheatsheet (1) clang-format (1) class (1) cmake (3) cmake-format (1) conan (2) constexpr if (1) cz (2) daw (2) decltype(x) (1) desktop (2) duševní zdraví (1) email (1) emoce (4) enum (1) enum class (1) functor (1) git (1) gnome (4) gnome-extension (1) helloworld (2) hranice (1) js (1) keyboard (2) linux (6) llm (1) lvalue (1) metodika řízení (2) midi (2) modern c++ (48) motivace (1) music (6) music production (1) native instruments (1) nodiscard (1) noexcept (1) operator (1) osobnost (1) osobní hranice (1) override (1) package manager (1) Perfect Forwarding (1) plugin (1) poděkování (1) polymorfism (1) prospěch (1) psyché (2) python (2) rspamd (1) rvalue (1) růst (2) scale (2) self-stress (1) sociální sítě (1) software (1) spam (1) std (28) std::accumulate (1) std::async (2) std::divides (1) std::filesystem::path (2) std::forward (1) std::future (3) std::istream_iterator (1) std::latch (1) std::lerp (1) std::minus (1) std::modulus (1) std::multiplies (1) std::negate (1) std::ostream_iterator (1) std::packaged_task (1) std::partition (1) std::partition_copy (1) std::plus (1) std::promise (2) std::shiftleft (1) std::shuffle (1) std::transform (1) std::tuple (1) std::variant (1) std::views::transform (1) std::visit (1) strach (1) strategie (1) synthesizer (1) toxic (2) toxicita (1) toxík (1) using (2) vztah k sobě (1) vztahy (3) vývoj (1) zdraví (2)