Ce face std::for_each
std::for_each apelează funcția f pentru fiecare element, în ordine. Dacă funcția primește elementul prin referință (T&), îl poate modifica.
În codul modern, bucla for (auto& x : v) face de obicei același lucru mai clar. for_each rămâne util când lucrezi cu un interval parțial (doi iteratori) sau cu o funcție deja scrisă. Returnează funcția primită, ceea ce permite să citești o stare acumulată în ea.
Parametri
| Parametru | Descriere |
|---|---|
first, last |
Intervalul parcurs. |
f |
Funcția apelată cu fiecare element. |
Ce returnează
Obiectul funcție f, după ce a fost aplicat tuturor elementelor.
Exemple
Exemplul 1: Scumpirea tuturor produselor cu 10%
#include <algorithm>
#include <print>
#include <vector>
int main() {
std::vector<double> preturi{10.0, 25.5, 99.9};
std::for_each(preturi.begin(), preturi.end(), [](double& p) { p *= 1.10; });
for (double p : preturi) {
std::println("{:.2f} lei", p);
}
}
Rezultat
11.00 lei
28.05 lei
109.89 lei
Exemplul 2: Doar o parte din vector
Aici se afișează doar primele trei elemente; std::ranges::for_each parcurge tot vectorul.
#include <algorithm>
#include <print>
#include <string>
#include <vector>
int main() {
std::vector<std::string> clasament{"Ana", "Ion", "Maria", "Radu", "Elena"};
std::for_each(clasament.begin(), clasament.begin() + 3,
[](const std::string& nume) { std::println("Premiat: {}", nume); });
std::ranges::for_each(clasament, [](const std::string& nume) { std::print("{} ", nume.size()); });
std::println("");
}
Rezultat
Premiat: Ana
Premiat: Ion
Premiat: Maria
3 3 5 4 5
Greșeli frecvente
- Lambda primește elementul prin valoare (
double p) și îl modifică. Se modifică doar copia; ai nevoie dedouble& p. - Adaugi sau ștergi elemente din vector în timpul lui
for_each. Iteratorii devin invalizi și comportamentul este nedefinit.
Comenzi înrudite
std::transform: Aplică o funcție fiecărui element și scrie rezultatele în alt interval (sau în același).std::accumulate: Adună toate elementele unui interval pornind de la o valoare inițială (sau le combină cu o operație dată).std::views::transform: Creează o vedere în care fiecare element este rezultatul unei funcții aplicate elementului original.