2015-03-09 4 views
31

निम्नलिखित घोषणाओं पर विचार करें? उदाहरण के लिए, v3d के लिए 2 और v3d के लिए 3?मैं नेस्टेड वेक्टर (आकार नहीं) के आयाम (घोंसला) कैसे प्राप्त करूं?</p> <pre><code>vector<vector<int> > v2d; vector<vector<vector<string>> > v3d; </code></pre> <p>मैं कैसे बाद कोड में वैक्टर की "आयामी स्वरूप" पता कर सकते हैं:

+9

सी ++ दृढ़ता से टाइप किया गया है ताकि आप इस तथ्य से आयाम को पहले से ही जान सकें कि आप इसका उपयोग कर सकते हैं। 2 डी हमेशा एक ही दायरे में 2 आयामी वेक्टर होगा। – Rado

+2

क्या आप एक संदर्भ प्रदान कर सकते हैं जहां आप इस जानकारी से अवगत नहीं होंगे? – Galik

+6

@ गैलिक टेम्पलेट्स। – emlai

उत्तर

57

कुछ:

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

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

तो उदाहरण के लिए,

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

आकर्षक संपत्ति है कि सभी मूल्यांकन संकलन समय पर कर रहे हैं।

+2

मैं इस समाधान को पसंद करता हूं, इसका संकलन समय पर मूल्यांकन किया जाता है और यह "type_traits" तरीके से अधिक होता है। –

+2

आप के साथ-साथ यदि आप इसे एक समारोह की तरह कॉल करना चाहते हैं कस्टम allocators के लिए समर्थन जोड़ सकता है –

+1

उपयोग निम्नलिखित: 'टेम्पलेट constexpr रैंक (टी स्थिरांक और) { वापसी रों :: मंद size_t; } '' के रूप में :: dims' थोड़ा बदसूरत है। यह एक ही कोड किसी भी तरह से उत्पन्न करेंगे (जैसे ',% esi' $ 3 movl) –

18

आप कुछ इस तरह कर सकता है:

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

Sidenote: यह मात्रा कभी-कभी "rank" कहा जाता है। इन पंक्तियों पर

+4

यह बेकार अस्थायी लोगों का एक समूह बनाता है; हो सकता है कि इसे –

+1

में सुधार किया जा सके और रनटाइम –

+0

@MattMcNabb पर कंप्यूटेशंस बनाता है किसी भी सिन कंपाइलर को निरंतर इनलाइन करने में सक्षम होना चाहिए। – imallett

संबंधित मुद्दे

 संबंधित मुद्दे