2017-07-04 1 views
0

Ich habe eine 2-dimensionale von s und ich möchte es mit 0s füllen. Die einzige Lösung für dieses Problem, die ich gefunden ist, einen Zeiger auf das erste Element zu verwenden und sizeof, etwa so:Was ist der STL-Weg, um ein 2-dimensionales std :: -Array ohne Iteration zu füllen?

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

Obwohl es funktioniert, ist die Leitung nicht mit anderen Methoden bis ich zum Befüllen 1D gefunden habe std::array s ohne Zeigerlogik, wie die beiden folgenden:

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

konnte ich über jedem Array durchlaufen, etwa so:

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

aber es scheint, wäre es viel mo Es ist effizient, das Array in einem Durchgang zu füllen. Gibt es eine sauberere Methode für 2D-Arrays oder bleibe ich bei der C-style-Pointer-Logik?

+1

Warum nehmen Sie 'std :: fill' nicht eine ähnliche Schleife rollen. Wenn Sie mit Nullen füllen möchten, könnte 'std :: memset' verwendet werden. – DeiDei

+1

@DeiDei Eines meiner Ziele für meine C++ Programmierung ist die Vermeidung von C-style Logik wie 'memset'. Ich gehe nicht davon aus, dass 'std :: fill' oder' std :: memset' eine Schleife wie mein Beispiel rollen wird oder nicht. Ich vertraue darauf, dass die Implementierungsentwickler bessere Programmierer sind als ich und Optimierungen nach Bedarf vorgenommen haben. – robbie0630

+0

1. Was ist der Array-Elementtyp? 2. fülle mit 0s oder mit einem beliebigen Wert? –

Antwort

4

In Ihrem Fall einfach zuweisen (oder initialisieren) mit {}:

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

arr2d = {}; //ditto 
+0

Das ist nicht was ich will. Ich möchte das Array leeren, nachdem es initialisiert wurde. – robbie0630

+0

Weisen Sie ihr also '{}' zu. –

+0

Oh, Entschuldigung. Ich wusste nicht, dass du das kannst! – robbie0630

Verwandte Themen