2016-08-02 10 views
5

कई एसटीएल एल्गोरिदम हैं जो एल्गोरिदम के परिणाम को स्टोर करने के लिए आउटपुट इटरेटर पर भरोसा करते हैं।आउटपुट इटरेटर एडाप्टर गिनने के लिए, लेकिन प्रतिलिपि

उदाहरण के लिए, std::set_intersection आउटपुट इटरेटर में दो क्रमबद्ध श्रेणियों के बीच सभी सामान्य तत्वों को संग्रहीत करेगा जो उसके बाद आउटपुट प्रति तत्व बढ़ाए गए हैं।

कभी-कभी, मुझे वास्तविक तत्वों में रुचि नहीं है बल्कि केवल आउटपुट तत्वों की संख्या है। ऐसे मामलों में यह तत्वों की प्रतिलिपि बनाने के लिए स्मृति और प्रदर्शन का अपशिष्ट है। क्या कोई इटरेटर एडाप्टर है जिसका उपयोग मैं तत्वों की प्रति को गिनने और उससे बचने के लिए कर सकता हूं? यदि आप ऐसा एडाप्टर का सामान्य कार्यान्वयन नहीं कर सकते हैं?

+0

वोटिंग एक संसाधन अनुरोध के रूप में बंद करने के लिए, लेकिन आप चाहते हो सकता है [ 'बढ़ावा देने :: counting_iterator'] (http://www.boost.org/doc/libs/1_50_0/libs/iterator/doc/counting_iterator। एचटीएमएल) – NathanOliver

+0

आपका प्रश्न थोड़ा अस्पष्ट है: आप जानना चाहते हैं कि चौराहे की गणना किए बिना 2 सेटों के चौराहे में कितने तत्व होंगे? – wasthishelpful

+0

@wasthishelpful हाँ, set_difference के मेरे उदाहरण में, लेकिन मैं इस तरह के एल्गोरिदम के लिए एक सामान्य ओप्यूट इटरेटर समाधान की तलाश में हूं। – T33C

उत्तर

0

@ecatmur जवाब और टिप्पणियों से मदद का एक बहुत कुछ करने के लिए धन्यवाद, मैं निम्नलिखित समाधान है, जो मैं टिप्पणियां आमंत्रित करे। मुझे boost::make_function_output_iterator काम करने की उम्मीद थी लेकिन ऐसा लगता है कि लाइब्रेरी में एक बग है जो असाइनमेंट ऑपरेटर को परिभाषित करने में विफल रहता है।

#include <algorithm> 
#include <vector> 
#include <iostream> 
#include <string> 
#include <cassert> 

class counting_output_iterator 
{ 
public: 
    counting_output_iterator& operator=(const counting_output_iterator&) { return *this; }; 
    explicit counting_output_iterator(std::size_t& count) : m_count(count) {} 
    template<typename T> void operator=(const T&) {}; //NULL op 
    using iterator_category = std::output_iterator_tag; 
    using value_type = void; 
    using difference_type = void; 
    using pointer = void; 
    using reference = void;  
    counting_output_iterator& operator*() { return *this; } 
    counting_output_iterator& operator++() { ++m_count; return *this; } 
    std::size_t& m_count; 
}; 

int main(int, char*[]) 
{ 
    std::vector<int> arr{ 1,2,3,4 }; 
    std::size_t count = 0; 
    std::copy(std::begin(arr), std::end(arr), counting_output_iterator{ count }); 
    assert(count == 4u); 
    return 0; 
} 
4

बूस्ट के Function Output Iterator आप क्या चाहते हैं कर सकते हैं:

std::size_t count = 0u; 
int arr[]{0, 1, 2, 3}; 
std::copy(std::begin(arr), std::end(arr), 
    boost::make_function_output_iterator([&](auto const&) { ++count; })); 
assert(count == 4u); 

केवल मुद्दा आप इटरेटर बाहर गिनती चर घोषित करने के लिए है कि है, कोई रास्ता नहीं एक boost::function_output_iterator से संग्रहीत समारोह वस्तु को निकालने के लिए है, क्योंकि (और लैम्बडा से बंद मूल्यों को निकालने का कोई भी तरीका नहीं है, भले ही आप उस बाधा से पहले हो)। यदि आप एक-लाइनर लिखने में सक्षम होना चाहते हैं, तो आपको इसे इटरेटर क्लास लिखना होगा, लेकिन यह कोड की एक बड़ी मात्रा नहीं है; उदाहरण के लिए:

class counting_output_iterator { 
public: 
    using iterator_category = std::output_iterator_tag; 
    using value_type = void; 
    using difference_type = void; 
    using pointer = void; 
    using reference = void; 

    std::size_t value = 0u; 

    struct output_proxy { 
    output_proxy(std::size_t& value) : m_value(value) { } 
    template<class T> output_proxy& operator=(T const&) { 
     ++m_value; 
     return *this; 
    } 
    std::size_t& m_value; 
    }; 
    output_proxy operator*() { return output_proxy(value); } 
    counting_output_iterator& operator++() { return *this; } 
    counting_output_iterator& operator++(int) { return *this; } 
}; 

उपयोग:

int arr[]{0, 1, 2, 3}; 
auto const count = std::copy(std::begin(arr), std::end(arr), 
    counting_output_iterator{}).value; 
assert(count == 4u); 
+0

वादा करता है लेकिन कोड बूस्ट 1.5 9 के साथ VS2015U2 में संकलित नहीं करता है। हटाए गए फ़ंक्शन को संदर्भित करने का प्रयास कर रहा है। मैंने एक मज़ेदार के साथ प्रतिस्थापित किया जो संकलित करता है लेकिन 3 की बजाय 6 की गणना करता है। अजीब! मैं अभी भी जांच कर रहा हूँ। तुम्हारे सुझाव के लिए धन्यवाद। – T33C

+0

आपने काफी संपादन किए हैं क्योंकि मैंने टिप्पणी की है ताकि पहले ऐसा करने की कोशिश की जा सके जो ऊपर मेरी टिप्पणी को अमान्य कर दे। आपकी सहायता के लिए धन्यवाद. – T33C

+0

लैम्ब्डा समाधान अभी भी विफल रहता है। Counting_output_operator काम करता है लेकिन आउटपुट इटरेटर को वापस करने वाले एल्गोरिदम पर निर्भर करता है अन्यथा मान सुलभ नहीं है। आपने मुझे सही रास्ते पर रखा है और मैं और अधिक प्रयोग करूंगा। – T33C

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