2011-06-07 15 views
12

सी ++ एसटीएल कंटेनर पर जेनेरिक ऑपरेशंस कैसे लिखें? उदाहरण के लिए, जावा में Collection इंटरफ़ेस है, जो प्रत्येक जावा कंटेनर (मानचित्रों को छोड़कर) लागू करता है। मैं वास्तविक कंटेनर लिंक्डलिस्ट, हैशसेट, ऐरेब्लॉकिंग क्यूई, इत्यादि के बावजूद जोड़ने, निकालने, शामिल करने और पुनरावृत्तियों जैसे संचालन कर सकता हूं। मुझे यह बहुत शक्तिशाली लगता है। सी ++ में इटरेटर हैं, लेकिन ऑपरेशन के बारे में क्या है जैसे जोड़ने और निकालें? वेक्टर में push_back है, सेट डाला गया है, कतार धक्का है। एक सामान्य तरीके से सी ++ कंटेनर में कुछ कैसे जोड़ें?सी ++ कंटेनर पर जेनेरिक ऑपरेशंस

+3

सी ++ मानक के अनुभाग 25 की जांच करें, इसमें विभिन्न एल्गोरिदम के 28 पृष्ठ हैं, जो विभिन्न कंटेनरों पर काम करते हैं। –

उत्तर

9

शीर्षलेख <algorithm> पर देखें। खोजने, क्रमबद्ध करने, गिनने, प्रतिलिपि बनाने के लिए वहां बहुत सारे सामान्य एल्गोरिदम हैं, जो कि विभिन्न निर्दिष्ट विशेषताओं वाले इटरेटर प्रदान करने वाले किसी भी चीज़ पर काम करते हैं।

8

सी ++ में std::inserter और दोस्तों को एक सामान्य तरीके से एक कंटेनर में तत्व जोड़ने के लिए है। वे हेडर फ़ाइल iterator में हैं।

21

पुनरावृत्ति:

सभी मानक कंटेनर iterators जो कंटेनर के तत्वों के लिए उपयोग का आदेश दिया दे दिया है। इन्हें जेनेरिक एल्गोरिदम में भी इस्तेमाल किया जा सकता है जो किसी भी अनुरूप इटरेटर प्रकार पर काम करते हैं।

प्रविष्टि:

सभी दृश्यों और साहचर्य कंटेनरों अभिव्यक्ति c.insert(i, x) द्वारा उन्हें में डाला तत्वों हो सकता है - जहां c एक दृश्य या साहचर्य कंटेनर है, ic और x में एक इटरेटर है एक मूल्य है कि आप c में जोड़ना चाहते हैं।

std::inserter और दोस्तों को एक सामान्य तरीके से अनुक्रम या सहयोगी कंटेनर में तत्व जोड़ने के लिए उपयोग किया जा सकता है।

हटाने:

किसी भी क्रम या साहचर्य कंटेनर निम्न कोड के लिए काम करता है:

while (true) { 
    X::iterator it(std::find(c.begin(), c.end(), elem)); 
    if (it == c.end()) break; 
    c.erase(it); 
} 

कहाँ X कंटेनर के प्रकार है, c एक कंटेनर वस्तु है और elem के साथ एक वस्तु है वह मान जिसे आप कंटेनर से हटाना चाहते हैं।

दृश्यों के लिए मिटा-निकालें मुहावरा है, जो लग रहा है जैसे:

c.erase(std::remove(c.begin(), c.end(), elem), c.end()); 

साहचर्य कंटेनरों के लिए आप भी कर सकते हैं:

c.erase(k); 

कहाँ k एक प्रमुख तत्व के लिए इसी है कि आप मिटाना चाहते हैं।

इस सब के लिए एक अच्छा इंटरफ़ेस:

Boost.Range देखें।

नोट - ये संकलित समय प्रतिस्थापन योग्य हैं, जबकि जावा लोग समय-समय पर प्रतिस्थापन योग्य होते हैं। रन-टाइम प्रतिस्थापन की अनुमति देने के लिए टाइप एरर का उपयोग करना आवश्यक है (यानी - एक टेम्पलेटेड सब-क्लास बनाएं जो उस कंटेनर को आवश्यक इंटरफ़ेस आगे बढ़ाता है जिसे इसके साथ तत्काल किया जाता है)।

+0

मिटाने-निकालने केवल _sequences_ पर काम करता है, सभी मानक कंटेनर नहीं। –

+0

@ चार्ल्स बेली - टिप के लिए धन्यवाद! उत्तर अपडेट किया गया। – Mankarse

+3

लेकिन आपने "या सहयोगी कंटेनर" लिखा है जो ठीक से कंटेनर थे जिन्हें मैं सोच रहा था कि आप मिटा-निकालने का उपयोग नहीं कर सकते हैं। –

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