std::copy în C++

Copiază elementele unui interval (copy) sau primele n elemente (copy_n) la o destinație.

Sintaxă
OutputIt copy(InputIt first, InputIt last, OutputIt d_first);
OutputIt copy_n(InputIt first, Size n, OutputIt d_first);  // C++11

Ce face std::copy

std::copy copiază [first, last) la poziția d_first, în ordine. std::copy_n copiază exact n elemente începând de la first.

Destinația trebuie să aibă deja loc pentru elemente sau să fie un iterator de inserare, precum std::back_inserter(v). Poți copia și direct pe ecran cu std::ostream_iterator.

Parametri

Parametru Descriere
first, last Sursa (pentru copy).
n Câte elemente se copiază (pentru copy_n).
d_first Începutul destinației.

Ce returnează

Iterator după ultimul element scris în destinație.

Exemple

Exemplul 1: Copiere în alt vector

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

int main() {
    std::vector<int> original{4, 8, 15, 16, 23, 42};

    std::vector<int> copie(original.size());
    std::copy(original.begin(), original.end(), copie.begin());

    std::vector<int> primele3;
    std::copy_n(original.begin(), 3, std::back_inserter(primele3));

    std::println("Copie: {}", copie);
    std::println("Primele 3: {}", primele3);
}

Rezultat

Copie: [4, 8, 15, 16, 23, 42]
Primele 3: [4, 8, 15]

Exemplul 2: Afișare cu ostream_iterator

Al doilea argument al lui ostream_iterator este separatorul pus după fiecare element.

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

int main() {
    std::vector<std::string> zile{"luni", "marți", "miercuri"};
    std::copy(zile.begin(), zile.end(), std::ostream_iterator<std::string>(std::cout, " | "));
    std::cout << '\n';
}

Rezultat

luni | marți | miercuri |

Greșeli frecvente

  • Destinația este un vector gol și folosești copie.begin(). Algoritmul nu mărește vectorul; scrie în afara lui. Fă resize înainte sau folosește back_inserter.
  • Copiezi într-un interval care se suprapune cu sursa spre dreapta. Pentru asta există std::copy_backward.

Comenzi înrudite

  • std::copy_if: Copiază doar elementele care îndeplinesc o condiție, păstrând ordinea lor.
  • std::move: Mută elementele unui interval la o destinație, fără să le copieze (versiunea din <algorithm>).
  • std::transform: Aplică o funcție fiecărui element și scrie rezultatele în alt interval (sau în același).
  • std::fill: Atribuie aceeași valoare tuturor elementelor unui interval (fill) sau primelor n elemente (fill_n).