2016-05-06 8 views
2

Ich würde gerne die size() oder die Nummer rows in einem Array von std::vector() überprüfen.Größe des Arrays von Std :: Vektor

Ich habe Vektor wie

std::vector<int> vec[3]; 

vec.size() nicht mit der obigen Vektor Erklärung nicht funktioniert.

+2

Sie möchten 'std :: distance (std :: begin (vec), std :: end (vec))'. In C++ 17 wollen Sie 'std :: size (vec)'. –

+0

Sie können 'sizeof (vec)/sizeof (std :: vector )' verwenden. –

+0

Ich denke er meint, er will 'vec [0] .size() + vec [1] .size() + vec [2] .size()'. Falls dies wirklich erforderlich ist, achten Sie darauf, dass die obige Berechnung einen Unterschied zu 'vec [0] .capacity() + vec [1] .capacity() + vec [2] .capacity()' – GeorgeAl

Antwort

8

Was, warum vec.size() nicht funktioniert, ist es, weil vec kein Vektor ist, ist es ein Array (Vektoren) und Arrays in C++ nicht Objekte sind (im OOP Sinn dass sie keine Instanzen einer Klasse sind) und daher keine Mitgliedsfunktionen haben.

Wenn Sie das Ergebnis 3 wenn vec.size() tun wollen, dann müssen Sie entweder verwenden, z. std::array:

std::array<std::vector<int>, 3> vec; 
std::cout << "vec.size() = " << vec.size() << '\n'; // Will output 3 

Oder wenn Sie nicht über std::array dann einen Vektor von Vektoren verwenden und die Größe festgelegt die durch den Aufruf richtig constructor:

std::vector<std::vector<int>> vec(3); 
std::cout << "vec.size() = " << vec.size() << '\n'; // Will output 3 
+1

Arrays sind immer noch Objekte, unabhängig davon, ob es sich um benutzerdefinierte Typen handelt oder nicht. – Galik

+0

@Galik Arrays sind kein Objekt im typischen objektorientierten Sinn, wo Sie Klassen und Objekte (Instanzen von Klassen) haben. Die C++ - Spezifikation ruft auch andere Dinge Objekte auf, einschließlich Arrays, die etwas verwirrend sein könnten. –

+0

Danke für Ihre Antwort. Benötige ich die Größe des Vektors ie 'vec (3)' zur Kompilierzeit oder Laufzeit, um die Größe des Vektors über die Befehlszeile zu akzeptieren –

1

Versuchen

int Nrows = 3; 
int Ncols = 4 
std::vector<std::vector<int>> vec(Nrows); 
for(int k=0;k<Nrows;k++) 
    vec[k].resize(Ncols); 

... 

auto Nrows = vec.size(); 
auto Ncols = (Nrows > 0 ? vec[0].size() : 0); 
2

in std::vector<int> vec[3]; inhärenten Es gibt nichts, wo der erste zu sagen, oder die zweite Indizierung stellt "Zeilen" vs. "Spalten" dar - es ist alles eine Frage Ihrer eigenen Perspektive als Programmierer. Das heißt, wenn man bedenkt, das 3 Reihen haben, können Sie diese Nummer abrufen können ...

std::extent<decltype(vec)>::value 

... für die Sie #include <type_traits> benötigen. Siehe here.

Wie auch immer, ist std::array<> speziell entwickelt, um eine bessere, einheitliche Schnittstelle zur Verfügung zu stellen - und wird bereits vertraut sein, von std::vector:

std::array<std::vector<int>, 3> vec; 
...use vec.size()... 

(Konsistenz ist besonders wichtig, wenn Sie Templat-Code wollen beide Vektoren und Matrizen zu handhaben .)