2017-07-04 1 views
0

J'ai un 2 dimensions std::array de std::array s et je veux le remplir avec 0s. La seule solution à ce que j'ai trouvé est d'utiliser un pointeur vers le premier élément et sizeof, comme ceci:Quelle est la méthode STL pour remplir un tableau bidimensionnel std :: sans itération?

std::fill(&arr2d[0][0], &arr2d[0][0] + sizeof(arr2d), 0); 

Bien qu'il fonctionne, il ne correspond pas avec d'autres méthodes que j'ai trouvé pour le remplissage 1D std::array s sans logique de pointeur, comme les deux suivantes:

std::fill(arr1d.begin(), arr1d.end(), 0); 
arr1d.fill(0); 

Je pourrais itérer sur chaque tableau, comme suit:

for (auto& it : arr2d) { 
    it.fill(0); 
} 

mais il semble que ce serait beaucoup plus mo re efficace pour remplir le tableau en un seul passage. Y at-il une méthode plus propre pour les tableaux 2D, ou suis-je coincé avec la logique du pointeur de style C?

+1

Pourquoi vous en assumerez 'std :: fill' ne roulera pas une boucle similaire. Si vous souhaitez remplir avec 0, alors 'std :: memset' pourrait être utilisé. – DeiDei

+1

@DeiDei Un de mes objectifs pour ma programmation en C++ est d'éviter la logique de type C comme 'memset'. Je ne suppose pas que 'std :: fill' ou' std :: memset' va ou ne lancera pas une boucle comme mon exemple. Je crois que les rédacteurs de mise en œuvre sont de meilleurs programmeurs que moi et ont fait des optimisations au besoin. – robbie0630

+0

1. Quel est le type d'élément de tableau? 2. remplir avec 0 ou avec une valeur arbitraire? –

Répondre

4

Dans votre cas, il suffit d'attribuer (ou initialize) avec {}:

using arr2d_t = std::array<std::array<unsigned char, 32>, 64>; 
arr2d_t arr2d = {}; // all zeroes 

arr2d = {}; //ditto 
+0

Ce n'est pas ce que je veux. Je veux vider le tableau après qu'il a été initialisé. – robbie0630

+0

Donc lui assigner '{}'. –

+0

Oh, désolé. Je ne savais pas que tu pouvais faire ça! – robbie0630