fill() für mehrdimensionalen vector



  • Hallo,

    ich traue mich ja kaum noch zu fragen, aber Google gibt absolut nichts her und ich habe alle Kombinationen versucht.

    vector<vector<bool> > field(80,25);
    fill(field.begin(), field.end(), false); // Wie muss das hier lauten?
    


  • Du musst zuerst einen temporären vector füllen und dann den als Wert bei dem für den äusseren vector angeben. Probier nicht in vectoren zu denken, sondern einfach nur wie du das für andere Sachen machen würdest, dann wird die Funktionsweise automatisch klar.



  • Gib mir bitte ein Beispiel. Ich bin absolut ne Null darin, Textaufgaben zu abstrahieren 😉


  • Mod

    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/c15257

    Tatsä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/c15257

    Tatsä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.


Anmelden zum Antworten