std::copy_if în C++

Copiază doar elementele care îndeplinesc o condiție, păstrând ordinea lor.

Sintaxă
OutputIt copy_if(InputIt first, InputIt last, OutputIt d_first, UnaryPred conditie);

Ce face std::copy_if

std::copy_if este „filtrul” clasic din STL: parcurge sursa și copiază la destinație doar elementele pentru care condiția returnează true. Sursa rămâne neschimbată.

Pentru că nu știi dinainte câte elemente trec, destinația este de obicei std::back_inserter. În C++20, std::views::filter face același lucru fără copiere.

Parametri

Parametru Descriere
first, last Sursa.
d_first Destinația.
conditie Funcție care decide dacă elementul este copiat.

Ce returnează

Iterator după ultimul element scris.

Exemple

Exemplul 1: Doar numerele pare

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

int main() {
    std::vector<int> numere{3, 8, 12, 7, 6, 1, 10};
    std::vector<int> pare;

    std::copy_if(numere.begin(), numere.end(), std::back_inserter(pare), [](int n) { return n % 2 == 0; });
    std::println("{}", pare);
}

Rezultat

[8, 12, 6, 10]

Exemplul 2: Clienții dintr-un oraș

#include <algorithm>
#include <iterator>
#include <print>
#include <string>
#include <vector>

struct Client {
    std::string nume;
    std::string oras;
};

int main() {
    std::vector<Client> clienti{{"Ana", "Iași"}, {"Dan", "Cluj"}, {"Ioana", "Iași"}, {"Vlad", "Arad"}};
    std::vector<Client> din_iasi;

    std::ranges::copy_if(clienti, std::back_inserter(din_iasi),
                         [](const Client& c) { return c.oras == "Iași"; });

    for (const Client& c : din_iasi) {
        std::println("{}", c.nume);
    }
}

Rezultat

Ana
Ioana

Greșeli frecvente

  • Vrei să elimini elementele din vectorul original și folosești copy_if. Pentru ștergere pe loc ai nevoie de std::erase_if sau de remove_if + erase.

Comenzi înrudite

  • std::copy: Copiază elementele unui interval (copy) sau primele n elemente (copy_n) la o destinație.
  • std::remove_if: Elimină logic elementele care îndeplinesc o condiție; folosit cu erase sau înlocuit de std::erase_if (C++20).
  • std::views::filter: Creează o vedere asupra unui container care conține doar elementele ce îndeplinesc o condiție, fără copiere.
  • std::partition: Împarte elementele în două grupuri: întâi cele care îndeplinesc condiția, apoi celelalte.