kanedo schrieb:
Aber ich muss dem Vector nicht sagen wie groß er zu sein hat, oder? Das müsste ja dann auch dynamisch gehen.
Das wäre mir sowieso lieber
Jein. Bei einem Vektor aus Vektoren bist du für die Grösse der Einträge verantwortlich. Nehmen wir folgendes Beispiel:
#include <vector>
#include <System.hpp>
typedef std::vector<AnsiString> StringVector1D;
typedef std::vector<StringVector1D> StringVector2D;
int main()
{
// erzeuge einen Vektor mit 100 Einträgen, die alle ein StringVector
// mit 3 AnsiStrings sind, die alle "Hallo" sind.
StringVector2D My2DVector( 100, StringVector1D( 3, "Hallo" ) );
// Vektor auf 200 Einträge vergrössern
// Das Problem ist nun, dass die Elemente 0-99 ein Vektor mit 3 AnsiStrings
// sind, während die neuen Einträge 100-199 alle leere Stringvektoren sind
My2DVector.resize( 200 );
// Lösung: Beim Vergrössern ein Referenzelement angeben, mit dem die neuen
// Einträge initialisiert werden:
My2DVector.resize( 300, StringVector1D( 3, "Hallo" ) );
}
Das Problem bei Vektoren aus Vektoren ist, dass alle "inneren" Vektoren individuelle Längen haben (wie jagged Arrays in C#). Bei einem resize() musst du sicherstellen, dass alle Vektoren auf die richtige Länge gebracht werden, z.B. mit folgender Funktion:
template<typename T>
void resize( std::vector<std::vector<T> >& v, unsigned int Rows, unsigned int Cols )
{
// Anzahl der Zeilen setzen
v.resize( Rows );
// für jede Zeile die Anzahl der Spalten setzen
for( std::vector<std::vector<T> >::iterator it = v.begin(); it != v.end(); ++it )
{
it->resize( Cols );
}
}