मैं निम्नलिखित वर्ग है स्थिरांक संदर्भ मान प्रकार के साथ एक ही नक्शे पर एक इटरेटर सूचक मान प्रकार के साथ एक unordered_map पर रूपांतरण इस वर्ग के _children
के तत्वों को फिर से संशोधित करने में सक्षम होने के तत्वों को पुन: सक्रिय करने के लिए। यही कारण है कि मैं एक इटरेटर बनाना चाहता हूं जो pair<char, ptr_type>
के बजाय pair<char, const Node&>
के तत्वों को इंगित करता है।पुनरावर्तक
बेस इटरेटर कक्षा बनाना हाथ के काम के लिए थोड़ा जटिल लगता है। मैंने बूस्ट इटरेटर पर एक नज़र डाली है, मुझे लगता है कि transform_iterator
जाने का रास्ता हो सकता है, लेकिन मुझे अभी तक यह नहीं मिला है कि इसे कैसे काम करना है।
जबकि मैं इसमें हूं, क्या किसी को पता है कि मैं boost-iterators
में परिभाषित इटरेटर्स के विभिन्न उदाहरणों के उदाहरण कहां पा सकता हूं? प्रत्येक प्रकार के लिए डॉक्टर में केवल एक उदाहरण है, और वे हमेशा मेरी ज़रूरतों को पूरा नहीं करते हैं (मैं इस पुस्तकालय में नया हूं, मैंने कुछ स्पष्ट याद किया होगा)।
अद्यतन: यहाँ boost::transform_iterator
class Node {
public:
typedef std::unique_ptr<Node> ptr_type;
typedef std::unordered_map<char, ptr_type> map_type;
struct Transformer {
std::pair<char, const Node&> operator()(const std::pair<char, ptr_type> &p) const {
return std::pair<char, const Node&>(p.first, *p.second);
}
};
typedef boost::transform_iterator<Transformer, map_type::const_iterator, std::pair<char, const Node&>&, std::pair<char, const Node&>> const_iterator;
const_iterator begin() const {
return boost::make_transform_iterator<Transformer, map_type::const_iterator>(_children.begin(), Transformer());
}
const_iterator end() const {
return boost::make_transform_iterator<Transformer, map_type::const_iterator>(_children.end(), Transformer());
}
private:
map_type _children;
};
का उपयोग कर यह दुर्भाग्य संकलन नहीं है पर मेरे प्रयास है, और निम्न त्रुटि देता है:
error: no type named ‘type’ in ‘boost::mpl::eval_if<boost::is_same<boost::iterators::use_default, boost::iterators::use_default>, boost::result_of<const Node::Transformer(const std::pair<const char, std::unique_ptr<Node> >&)>, boost::mpl::identity<boost::iterators::use_default> >::f_ {aka struct boost::result_of<const Node::Transformer(const std::pair<const char, std::unique_ptr<Node> >&)>}’
typedef typename f_::type type;
[ 'बढ़ावा देने :: transform_iterator'] (http://www.boost.org/doc/libs/1_53_0/libs/iterator/doc/transform_iterator.html) ऐसा करने में सक्षम होना चाहिए। या आप इन लाइनों के साथ अपना खुद का कस्टम इटरेटर रैपर लिख सकते हैं। –