2016-01-01 15 views
7

करने के लिए एक एसटीडी कंटेनर दर्रा मैं के साथ आया था निम्नलिखित:एक समारोह

template <typename T> inline void printcontainer(std::vector<T> container) 
{ 
    for(auto it = container.begin(); it != container.end(); it++) 
    { 
     std::cout << *it << std::endl; 
    } 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<int> v; 
    v.push_back(5); 
    v.push_back(4); 
    v.push_back(3); 
    printcontainer(v); 

    return 0; 
} 

(माफ करना push_backs के लिए, दृश्य स्टूडियो प्रारंभकर्ता सूचियों को स्वीकार नहीं करता है ... ओह !!)

अब

यह फ़ंक्शन std::vector तक सीमित है, मैं इसे कैसे बना सकता हूं ताकि मैं std::list सरणी आदि जैसे अन्य कंटेनर पास कर सकूं ...

+0

कुलपति के किन संस्करणों ++ प्रयोग कर रहे हैं कि प्रारंभकर्ता सूचियों का समर्थन नहीं करता है? – MikeMB

+0

विजुअल स्टूडियो 2012, 'std :: vector v {1,2,3} जैसी चीजें; 'समर्थित नहीं है, इसलिए आपको सी-स्टाइल सरणी वर्कअराउंड का उपयोग करना होगा जो मैं काफी तुच्छ जानता हूं। इसके अलावा इसमें 'std :: startizer_list' सुंदर अजीब नहीं है। –

+0

ठीक है, मुझे सी ++ 11 में इतना उपयोग किया गया है कि मैं भूल गया कि वीएस ने कई/सबसे अधिक अपनाया है? सी ++ 11 फीचर्स वीएस 2013 से पहले नहीं हैं। – MikeMB

उत्तर

7

बस कंटेनर द्वारा संग्रहीत प्रकार पर टेम्पलेट न करें, लेकिन इस प्रकार के प्रकार पर कंटेनर स्वयं:

template <typename Container> 
inline void printcontainer(const Container &container) 

ध्यान दें कि मैंने अनावश्यक प्रतिलिपि से बचने के लिए तर्क को const संदर्भ में बदल दिया है।

आप गैर-सदस्य std::begin और std::end का उपयोग करके या एक range based for loop का उपयोग करके सी सरणियों अपना प्रिंट समारोह सामान्यीकरण कर सकते हैं:

template <typename Container> 
inline void printcontainer(const Container &container) { 
    for (const auto &v : container) 
     std::cout << v << "\n"; 
} 

OT टिप्पणी: आप शायद inline यहां जरूरत नहीं है।

+0

वाह मैं '(कॉन्स ऑटो और वी: कंटेनर) के लिए बहुत प्रभावित हूं' इसे कैसे कहा जाता है? मैं इसका अध्ययन करूंगा –

+2

[रेंज-आधारित लूप (सी ++ 11 के बाद से)] (http://en.cppreference.com/w/cpp/language/range-for) – Drop

+0

tyvm, मैं यह जवाब स्वीकार करूंगा जैसे ही अनुमति देता है! –

2

क्लासिक स्टेपानोव के एसटीएल कंटेनर-इटरेटर-एल्गोरिदम जेनेरिक प्रोग्रामिंग शैली के विरुद्ध कंटेनर ऑब्जेक्ट पास करना है।

आमतौर पर एक से होकर गुजरेगा iterators:

# define ForwardIterator typename // workaround untill we have concepts 

template <ForwardIterator It> inline void printcontainer(It begin, It end) 
{ 
    for(;begin != end; ++begin) 
    { 
     std::cout << *begin << std::endl; 
    } 
} 

उपयोग:

std::vector<int> v = {1, 2, 3, 4}; 
printcontainer(v.cbegin(), v.cend()); 
+0

* "आप सी ++ फाइलों में जावा लिखने की कोशिश कर रहे हैं।" * कैसे? मुझे यहां कंटेनर पास करने में कोई समस्या नहीं है।वास्तव में, बूस्ट वर्बोजिटी कम करने के लिए मानक लाइब्रेरी में इटरेटर आधारित कार्यों के कई कंटेनर संस्करण प्रदान करता है। (मेरे डीवी बीटीडब्ल्यू नहीं।) –

+0

@ बाममितएगेन ठीक है, यह थोड़ा अधिक था, मैं इस वाक्यांश को हटा दूंगा;) – Drop

+1

जबकि यह नाममात्र रूप से ठीक लगता है, यह मैक्रो सिर्फ घृणित है और अपने आप को एक डाउनवोट का हकदार है। इसके अलावा, शिकारी शिकारी, श्रृंखला भविष्य हैं। – Puppy

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