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 destd::erase_ifsau deremove_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.