fill() für mehrdimensionalen vector
-
Gib mir bitte ein Beispiel. Ich bin absolut ne Null darin, Textaufgaben zu abstrahieren

-
Punkt 1:
vector<vector<bool> > field(80,25);
Dies hier ist kein 80x25 vector, sondern ein 80 Elemente vector bei dem die Elemente den Wert 25 bekommen. Da die Elemente aber vom Typ vector<bool> sein sollen, durfte dies nicht compilieren.
Siehe dazu die Referenz des vector-Kontruktors:
http://www.cplusplus.com/reference/stl/vector/vector/Entsprechend sieht man, was richtig wäre:
vector<vector<bool> > field(80, vector<bool>(25));
Ein vector mit 80 Elementen vom Typ vector<bool>, die jeweils mit 25 bool-Elementen gefüllt werden.Natürlich kann man auf die gleiche Weise auch gleich angegeben, dass sie alle false sein sollen:
vector<vector<bool> > field(80, vector<bool>(25, false));2. Zum fill: Entsprechend musst du bei fill einen vector als Füllmaterial übergeben:
fill(field.begin(), field.end(), vector<bool>(25,false));
Mit diesem vector wird dann der äußere vector gefüllt.3. Etwas was du vermutlich nicht weißt: vector<bool> ist eine spezielle Spezialisierung des vector-Templates, bei dem eine spezielle Implementierung durch den Standard vorgegeben ist. Dummerweise war man etwas übereifrig und die vorgegebene Implementierung sorgt dafür, dass der vector<bool> sich nicht mehr wie ein normaler vector verhält. Das hat man zwar später gemerkt, aber da war es zu spät, weil man nicht einfach so den Standard ändern kann. I
Google mal danach, damit du keine unangenehmen Überraschungen erlebst. Vielleicht bietet dein Compiler auch eine spezielle Version der Standardbibliothek an, die den vector<bool> nicht spezialisiert und die man durch gewisse Schalter aktivieren kann.
-
Achso
Vielen Dank. Dann war ich ja völlig auf dem Holzweg.Gibts denn einen "eleganten" Weg für bool-Arrays, wenn man nicht
bool field[80][25];verwenden will?
EDIT: Wäre std::tr1::array<> eine Lösung? Und wenn der Compiler C++0x beherrscht, muss dann das tr1 noch angegeben werden?
-
Was sagen die Experten hierzu:
#include <vector> using namespace std; int main() { vector<bool> field[80]; for (int i = 0; i < 80; field[i].resize(25, false), i++); bool test = field[79][8]; return 0;:xmas1:
-
lemon03 schrieb:
Achso
Vielen Dank. Dann war ich ja völlig auf dem Holzweg.Gibts denn einen "eleganten" Weg für bool-Arrays, wenn man nicht
bool field[80][25];Was ist daran nicht elegant???
-
Deshalb:
void editField(HANDLE set, bool (*field)[25]) [ ... ] bool field[80][25];
-
std::tr1::array<bool, 80, 25> field;Wäre das korrekt?
EDIT: Gilt das nur für VC2008?
http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15257
-
lemon03 schrieb:
EDIT: Gilt das nur für VC2008?
http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15257Tatsächlich. Jedenfalls ein eindimensionales std::tr1::array<>. Beim GNU GCC Compiler gibts bei mir Fehler.
-
lemon03 schrieb:
lemon03 schrieb:
EDIT: Gilt das nur für VC2008?
http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15257Tatsächlich. Jedenfalls ein eindimensionales std::tr1::array<>. Beim GNU GCC Compiler gibts bei mir Fehler.
Ein zweidimensionales Array ist ein Array von eindimensionalen Arrays:
using std::tr1::array; array<array<bool, 25>, 80> field;
-
Danke. Trotzdem geht das nur ab Visual C++ 2008.