में दो एसटीएल सेटों के एक चौराहे के आकार की गणना कैसे करें I को दो सेट (std :: <set>
से सेट) दिया गया है, जिसमें से मैं छेड़छाड़ के आकार को जानना चाहता हूं। मैं <algorithm>
से std :: set_intersection का उपयोग कर सकता हूं, लेकिन मुझे इसे किसी अन्य कंटेनर में छेड़छाड़ की प्रतिलिपि बनाने के लिए आउटपुट इटरेटर प्रदान करना होगा।सी ++
एक सरल तरीके से
set<int> s1{1,2,3,4,5};
set<int> s2{4,5,6,7,8,9,0,1};
vector<int> v;
set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter(v, v.begin()));
जो v.size() के बाद चौराहे के आकार देता होगा। हालांकि, चौराहे को भी संग्रहीत किया जाना चाहिए, भले ही हम इसके साथ कुछ भी न करें।
कि बचने के लिए, मैं एक डमी उत्पादन iterator वर्ग है, जो केवल गिना जाता है को लागू करने की कोशिश की है, लेकिन यह आवंटित नहीं करता है: जो हम कर सकते थे का उपयोग कर
template<typename T>
class CountingOutputIterator {
private:
int* counter_;
T dummy_;
public:
explicit CountingOutputIterator(int* counter) :counter_(counter) {}
T& operator*() {return dummy_;}
CountingOutputIterator& operator++() { // ++t
(*counter_)++;
return *this;
}
CountingOutputIterator operator++(int) { // t++
CountingOutputIterator ret(*this);
(*counter_)++;
return ret;
}
bool operator==(const CountingOutputIterator& c) {
return counter_ == c.counter_; // same pointer
}
bool operator!=(const CountingOutputIterator& c) {
return !operator==(c);
}
};
set<int> s1{1,2,3,4,5};
set<int> s2{4,5,6,7,8,9,0,1};
int counter = 0;
CountingOutputIterator<int> counter_it(&counter);
set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(), counter_it);
जिसके बाद काउंटर चौराहे का आकार रखता है।
हालांकि यह बहुत अधिक कोड है। मेरे प्रश्न हैं:
1) क्या पूरे चौराहे को संग्रहीत किए बिना चौराहे के आकार को प्राप्त करने के लिए मानक (लाइब्रेरी) तरीका या मानक चाल है? 2) चाहे स्वतंत्र है या नहीं, स्वतंत्र डमी इटेटरेटर के साथ दृष्टिकोण अच्छा है?
सामान्य तत्वों की संख्या की पहचान करने के लिए अत्यधिक जटिल लगता है। क्यों न सिर्फ लूप का उपयोग करें? – Aldehir
बहुत अजीब बात यह है कि जब आप वास्तव में चौराहे का उपयोग नहीं कर रहे हैं तो आकार जानने का क्या मतलब है? क्या आप इस बारे में स्पष्ट रूप से सोच रहे हैं? [इसे पढ़ें] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)। –
एक कस्टम इटरेटर की बजाय, एक कस्टम "कंटेनर" बनाने के लिए यह आसान होगा जिसमें 'डालने वाला) सदस्य होगा जो इसके साथ' insert_iterator' का उपयोग करता है और उसका उपयोग करता है। –