Est-il une fonction pour copier un tableau en C/C++?

Je suis un programmeur Java apprenant C / c++. Donc, je sais que Java a une fonction comme System.arraycopy(); pour copier un tableau. Je me demandais s'il y avait une fonction en C ou C++ pour copier un tableau. J'ai seulement pu trouver une implémentation pour copier un tableau en utilisant for loop, des pointeurs,etc. Est-il une fonction que je peux utiliser pour copier un tableau?

50
demandé sur juanchopanza 2013-04-22 05:05:04

9 réponses

Depuis C++11, vous pouvez copier des tableaux directement avec std::array:

std::array<int,4> A = {10,20,30,40};
std::array<int,4> B = A; //copy array A into array B

Voici la documentation à propos de std::array

54
répondu taocp 2013-04-22 01:22:49

Puisque vous avez demandé une solution c++...

#include <algorithm>
#include <iterator>

const int arr_size = 10;
some_type src[arr_size];
// ...
some_type dest[arr_size];
std::copy(std::begin(src), std::end(src), std::begin(dest));
88
répondu Ed S. 2018-05-23 13:57:27

Comme d'autres l'ont mentionné, dans C vous utilisez memcpy. Notez cependant que cela fait une copie de mémoire brute, donc si vos structures de données ont un pointeur vers elles-mêmes ou les unes vers les autres, les pointeurs de la copie pointeront toujours vers les objets d'origine.

En C++ , vous pouvez également utiliser memcpy si les membres de votre tableau sont des POD (c'est-à-dire essentiellement des types que vous auriez également pu utiliser inchangés en C), mais en général, memcpy ne sera pas autorisé. Comme d'autres l'ont mentionné, la fonction à utiliser est std::copy.

Cela dit, en C++, vous devriez rarement utiliser des tableaux bruts. Au lieu de cela, vous devriez soit utiliser l'un des conteneurs standard (std::vector est le plus proche d'un tableau intégré, et je pense aussi que le plus proche des tableaux Java-plus proche des tableaux c++ simples, en effet -, mais std::deque ou std::list peut être plus approprié dans certains cas) ou, si vous utilisez C++11, std::array qui est très proche Tous les types que j'ai mentionnés ici peuvent être copiés par affectation ou construction de copie. De plus, vous pouvez "copier" d'opne à un autre (et même à partir d'un tableau intégré) en utilisant la syntaxe de l'itérateur.

Cela donne un aperçu des possibilités (je suppose que tous les en-têtes pertinents ont été inclus):

int main()
{
  // This works in C and C++
  int a[] = { 1, 2, 3, 4 };
  int b[4];
  memcpy(b, a, 4*sizeof(int)); // int is a POD

  // This is the preferred method to copy raw arrays in C++ and works with all types that can be copied:
  std::copy(a, a+4, b);

  // In C++11, you can also use this:
  std::copy(std::begin(a), std::end(a), std::begin(b));

  // use of vectors
  std::vector<int> va(a, a+4); // copies the content of a into the vector
  std::vector<int> vb = va;    // vb is a copy of va

  // this initialization is only valid in C++11:
  std::vector<int> vc { 5, 6, 7, 8 }; // note: no equal sign!

  // assign vc to vb (valid in all standardized versions of C++)
  vb = vc;

  //alternative assignment, works also if both container types are different
  vb.assign(vc.begin(), vc.end());

  std::vector<int> vd; // an *empty* vector

  // you also can use std::copy with vectors
  // Since vd is empty, we need a `back_inserter`, to create new elements:
  std::copy(va.begin(), va.end(), std::back_inserter(vd));

  // copy from array a to vector vd:
  // now vd already contains four elements, so this new copy doesn't need to
  // create elements, we just overwrite the existing ones.
  std::copy(a, a+4, vd.begin());

  // C++11 only: Define a `std::array`:
  std::array<int, 4> sa = { 9, 10, 11, 12 };

  // create a copy:
  std::array<int, 4> sb = sa;

  // assign the array:
  sb = sa;
}
57
répondu celtschk 2015-02-14 14:43:17

Vous pouvez utiliser le memcpy(),

void * memcpy ( void * destination, const void * source, size_t num );

memcpy() copie les valeurs de num octets à partir de l'emplacement pointé par source directement sur le bloc de mémoire pointée par destination.

Si le destination et source se chevauchent, alors vous pouvez utiliser memmove().

void * memmove ( void * destination, const void * source, size_t num );

memmove() copie les valeurs de num octets à partir de l'emplacement pointé par source pour le bloc de mémoire pointée par destination. La copie a lieu comme si un tampon intermédiaire était utilisé, permettant à la destination et à la source de se chevaucher.

18
répondu Deepu 2013-04-22 04:21:46

Utilisez memcpy en C, std::copy en C++.

13
répondu Mehrdad 2013-04-22 01:12:34

En C, vous pouvez utiliser memcpy. En C++, utilisez std::copy de l'en-tête <algorithm>.

8
répondu Pete Becker 2013-04-22 01:12:53

En C++11, Vous pouvez utiliser {[1] } qui fonctionne pour les conteneurs std

template <typename Container1, typename Container2>
auto Copy(Container1& c1, Container2& c2)
    -> decltype(c2.begin())
{
    auto it1 = std::begin(c1);
    auto it2 = std::begin(c2);

    while (it1 != std::end(c1)) {
        *it2++ = *it1++;
    }
    return it2;
}
3
répondu MORTAL 2014-12-09 19:08:56

Tout d'Abord, parce que vous passez à C++, vecteur est recommandé pour être utilisé au lieu du traditionnel matrice. En outre, pour copier un tableau ou un vecteur, std::copy est le meilleur choix pour vous.

Visiter cette page pour obtenir comment utiliser la fonction de copie: http://en.cppreference.com/w/cpp/algorithm/copy

Exemple:

std::vector<int> source_vector;
source_vector.push_back(1);
source_vector.push_back(2);
source_vector.push_back(3);
std::vector<int> dest_vector(source_vector.size());
std::copy(source_vector.begin(), source_vector.end(), dest_vector.begin());
1
répondu Nhan Nguyen Tri Thanh 2016-12-06 23:15:32

Je donne ici 2 façons de faire face au tableau, pour le langage C et c++. memcpy et copie les deux ar utilisable sur le C++, mais copie n'est pas utilisable pour le C, vous devez utiliser memcpy si vous essayez de copier tableau en C.

#include <stdio.h>
#include <iostream>
#include <algorithm> // for using copy (library function)
#include <string.h> // for using memcpy (library function)


int main(){

    int arr[] = {1, 1, 2, 2, 3, 3};
    int brr[100];

    int len = sizeof(arr)/sizeof(*arr); // finding size of arr (array)

    std:: copy(arr, arr+len, brr); // which will work on C++ only (you have to use #include <algorithm>
    memcpy(brr, arr, len*(sizeof(int))); // which will work on both C and C++

    for(int i=0; i<len; i++){ // Printing brr (array).
        std:: cout << brr[i] << " ";
    }

    return 0;
}
1
répondu Fake_Death 2017-09-02 17:52:27