Je me retrouve souvent à vouloir copier le contenu des tableaux ayant une taille constante. En général, j'écris quelque chose dans le sens suivant:
float a[4] = {0,1,2,3};
float b[4];
for(int i=0; i<4; i++){
b[i]=a[i];
}
Récemment, j'écris une bibliothèque de calcul linéaire à des fins éducatives et je me demandais s'il y avait une meilleure façon de le faire.
La première chose qui me vint à l’esprit fut d’utiliser memcpy:
memcpy(b, a, sizeof(float) * 4);
Mais cela me semble très c-like et sujette aux erreurs. J'aime avoir mes erreurs au moment de la compilation, et cela peut devenir moche pour les types de données avec des constructeurs de copie non triviaux, ou si j'oublie de multiplier par sizeof (type de données).
Étant donné que j'écris une bibliothèque de maths que je vais utiliser intensément, la performance est très importante pour moi. Les compilateurs d’aujourd’hui sont-ils assez intelligents pour comprendre que le premier exemple consiste simplement à copier une partie de la mémoire et à l’optimiser pour qu’elle soit aussi efficace que la deuxième solution?
Peut-être y a-t-il une fonction dans la bibliothèque standard qui peut m'aider? Quelque chose de nouveau dans c ++ 11? Ou devrais-je simplement créer une macro ou une fonction de modèle?
Si vous utilisez std::array
au lieu d'un tableau intégré (ce que vous devriez), cela devient très simple. Copier un tableau revient alors à copier tout autre objet.
std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;
La méthode C++ 03 consisterait à utiliser std::copy()
:
float a[4] = {0,1,2,3};
float b[4];
std::copy(a,a + 4, b);
C'est à peu près aussi propre que possible. Sur C++ 11 préférez
std::copy(std::begin(a), std::end(a), std::begin(b));
Ou mieux encore, utilisez std :: array et obtenez une cession gratuitement:
std::array<float,4> a = {0,1,2,3};
auto b = a;
Si vous êtes intéressé par la solution C++ 03 (et aussi C), utilisez toujours une structure contenant un tableau plutôt que uniquement
struct s { float arr[5]; };
Les structures sont copiables par défaut.
Son équivalent en C++ 11 est, déjà mentionné, std::array<float,5>;
#include <algorithm>
std::copy_n(a, 4, b)
La méthode ci-dessous fonctionne aussi bien pour les tableaux habituels que std: array.
float a[4] = {0,1,2,3};
float b[4];
std::copy(std::begin(a), std::end(a), b);