std::for_each în C++

Aplică o funcție fiecărui element dintr-un interval, de exemplu pentru afișare sau modificare.

Sintaxă
Function for_each(InputIt first, InputIt last, Function f);

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 de double& 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.