निम्नलिखित न्यूनतम उदाहरण:unordered_map में बिडरेक्शनल इटरेटर्स?
#include <iostream>
#include <boost/unordered_map.hpp>
int main()
{
boost::unordered_map<int, int> m;
boost::unordered_map<int, int>::const_iterator i;
m.insert(std::make_pair(1, 2));
i = m.end();
--i;
std::cout << i->first << " -> " << i->second << std::endl;
return 0;
}
... संकलित करने के लिए विफल रहता है।
bidi.cxx: In function ‘int main()’:
bidi.cxx:13: error: no match for ‘operator--’ in ‘--i’
Boost's own documentation के अनुसार:
iterator
,const_iterator
कम से कम आगे श्रेणी के हैं।
ऐसा लगता है कि वे सब कुछ हैं। क्यूं कर? हैश-मैप किस तकनीकी प्रतिबंध को लगाता है जो इटरेटर को द्विपक्षीय होने से रोकता है?
(जीसीसी संस्करण 4.1.2, संस्करणों 1.40.0 और 1.43.0 बढ़ावा।)
यह शुद्ध अटकलें आपको दिमाग में रखती है, लेकिन ध्यान रखें कि आपके पीछे कुछ पीछे और आगे की ओर जाने में सक्षम होने के बाद प्रत्येक नोड को अगले आइटम और पिछली वस्तु में पॉइंटर होना होगा। यदि यह नक्शा केवल अगली वस्तुओं पर केवल पॉइंटर्स के साथ लागू किया गया था, तो आपके इटरेटर को यह पता लगाने का कोई तरीका नहीं होगा कि वर्तमान नोड से पहले क्या हुआ था, और इस प्रकार पीछे जाने का कोई तरीका नहीं था। –
ईमानदारी से मुझे यह अजीब लगता है (हालांकि कभी-कभी उपयोगी) कि unordered_maps भी iterators है। –
@Niki योशीचुची: मैंने पर्ल में इसी अवधारणा का उपयोग किया है। आम तौर पर, मैं चाहता हूं कि पर्ल को सहयोगी सरणी के रूप में कार्य करना पड़े, लेकिन कभी-कभी मैं पूरे हैश में कुछ करना चाहता हूं। पर्ल में, मैं चाबियों की सूची प्राप्त करने के लिए 'कुंजी' फ़ंक्शन का उपयोग करता हूं, और इसके माध्यम से पुनरावृत्ति करता हूं, जबकि सी ++ में स्पष्ट समतुल्य एक आगे इटरेटर होता है। मैं वास्तव में किसी भी डेटा संग्रह पर 'foreach' के बराबर करने की क्षमता को याद करता हूं। –