2015-03-09 10 views
31

Betrachten Sie die folgenden Erklärungen:Wie bekomme ich die Dimensionen (Nestedness) eines verschachtelten Vektors (NICHT die Größe)?

vector<vector<int> > v2d; 
vector<vector<vector<string>> > v3d; 

Wie kann ich die „Dimensionalität“ der Vektoren in den folgenden Code herausfinden? Zum Beispiel 2 für v2d und 3 für v3d?

+9

C++ ist stark typisiert, so dass Sie die Dimension bereits durch die Tatsache kennen, dass Sie sie verwenden können. 2d wird immer ein zweidimensionaler Vektor innerhalb desselben Bereichs sein. – Rado

+2

Können Sie einen Kontext angeben, in dem Sie diese Informationen nicht kennen würden? – Galik

+6

@Galik Vorlagen. – emlai

Antwort

57

Etwas auf diesen Linien:

template<class Y> 
struct s 
{ 
    enum {dims = 0}; 
}; 

template<class Y> 
struct s<std::vector<Y>> 
{ 
    enum {dims = s<Y>::dims + 1}; 
}; 

Dann zum Beispiel

std::vector<std::vector<double> > x; 
int n = s<decltype(x)>::dims; /*n will be 2 in this case*/ 

Hat die attraktive Eigenschaft, die alle Auswertungen sind bei Kompilierung.

+2

Ich bevorzuge diese Lösung, sie wird zur Kompilierzeit ausgewertet und ähnelt mehr dem "type_traits" -Weg. –

+2

Sie könnte die Unterstützung für benutzerdefinierte Verteilern als auch hinzufügen –

+1

Gehen Sie folgendermaßen, wenn Sie es wie eine Funktion aufgerufen werden soll: 'template constexpr size_t Rang (T const &) { return s :: dims; } 'as' s :: Dims ist ein bisschen hässlich. Es erzeugt den gleichen Code in beide Richtungen (z. B. 'movl $ 3,% esi') –

18

Man könnte so etwas tun:

template<typename T> 
int getDims(const T& vec) 
{ 
    return 0; 
} 
template<typename T> 
int getDims(const vector<T>& vec) 
{ 
    return getDims(T{})+1; 
} 

Nebenbei bemerkt: Diese Menge manchmal "rank" genannt wird.

+4

Das schafft eine Menge nutzloser Provisorien; vielleicht kann es verbessert werden –

+1

und macht Berechnungen zur Laufzeit –

+0

@MattMcNabb jeder vernünftige Compiler sollte in der Lage sein, dies zu einer Konstante zu inline. – imallett

Verwandte Themen