fill() für mehrdimensionalen vector



  • 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