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.