2010-05-18 20 views
5

मेरे पास एक मनमानी एसटीएल कंटेनर सी है, जिसमें मनमानी प्रकार टी के तत्व शामिल हैं। मैं एक std :: वेक्टर बनाना चाहता हूं जिसमें सभी तत्वों की एक प्रति है। ऐसा करने का सबसे साफ तरीका क्या है?मनमाने ढंग से एसटीएल कंटेनर के लिए मनमाने ढंग से टाइप

vector और set तरह
template <typename C> 
void myfunction(C container){ 

    /*Derive the type T of elements within the container*/ 

    std::vector<T> mystack; 

    /* Iterate over container and push_back() the elements into mystack*/ 
} 

उत्तर

11

एसटीएल संरचनाओं value_type प्रकार है कि T को typedef एड शामिल करना चाहिए।

std::vector<typename C::value_type> mystack; 

BTW, आप कंटेनर खुद से अधिक पुनरावृति की जरूरत नहीं है। बस

template <typename C> 
void myfunction(const C& container){ 
    std::vector<typename C::value_type> mystack(container.begin(), container.end()); 
    ... 
} 
+0

सोचा कि मैं इसे सी ++ 11 के लिए टक्कर दूंगा। क्या नया "ऑटो" कीवर्ड यहां काम करेगा? मुझे इसके साथ खेलने का मौका नहीं मिला है। –

+0

@ चाडब्रूबेकर: नहीं 'decltype' काम करेगा, लेकिन यह' typename C :: value_type' से आसान नहीं है। – kennytm

10

का उपयोग कंटेनरों के लिए, केनी सही समाधान दिया है। हालांकि, सी ++ में कई फ़ंक्शन कंटेनर के बजाय इटरेटर के जोड़े लेते हैं ... वही तर्क यहां लागू किया जा सकता है। Iterators iterator_traits का उपयोग उनसे संबंधित प्रकार के बारे में जानकारी प्रदान करने के:

template <typename It> 
void myfunction(It start, It end) { 
    // Get value for iterator: 

    typedef typename std::iterator_traits<It>::value_type T; 

    // Do something, e.g. calculate the minimum: 

    T min_value = *std::min_element(start, end); 
} 

वैसे, typename आवश्यक है में typedef क्योंकि value_type एक तथाकथित निर्भर प्रकार, यानी यह एक टेम्पलेट तर्क की प्रकृति पर निर्भर है और सी ++ कंपाइलर अपने आप को नहीं समझ सकता है कि यह इस संदर्भ में एक प्रकार का नाम (बजाय, एक स्थिर विधि या परिवर्तनीय) को संदर्भित करता है।

+3

यह केनी के जवाब के लिए एक अच्छा जोड़ा है, हालांकि मैं अपने अप-वोट के बारे में बहुत बेहतर महसूस करूंगा यदि आप एक इटेटरेटर को नामित नहीं करेंगे, तो अंतिम वैध तत्व को पारित करने वाले अंतिम वैध तत्व_ को अंतिम मान्य तत्व प्राप्त करने के समान ही। भ्रम के लिए बहुत संभावना है। – sbi

+0

@ एसबीआई: ** डी ओह! ** मैंने इस नोटेशन को लगातार अपने कोड में * वर्षों से उपयोग किया है * और कभी नहीं देखा कि यह एसटीएल उपयोग के साथ इतनी बुरी तरह संघर्ष करता है। बुरा बुरा बुरा बुरा। :-( –

+0

मैं एसटीएल एल्गोरिदम की तरह 'प्रथम', 'आखिरी' का उपयोग करता हूं। आपको इस तथ्य का सामना करना पड़ता है कि "आखिरी" सीमा का अंतिम इटरेटर * है, न कि अंतिम तत्व पर इंगित करने वाले इटरेटर * * श्रेणी में –

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