मेरी जानकारी के लिए, इटरेटर श्रेणियों के पदानुक्रम इस प्रकार है:इनपुट इटरेटर्स का उपयोग किया जा सकता है जहां आगे इटरेटर की उम्मीद है?
Random access -> Bi-directional -> Forward -> Input
-> Output
है न?
मैंने हमेशा सोचा था कि एक नियम था, कि यदि एक एल्गोरिदम एक विशेष प्रकार के इटरेटर की अपेक्षा करता है, तो आप श्रृंखला को श्रेणियों के इटरेटर प्रदान कर सकते हैं, लेकिन नीचे नहीं। तो मैं this answer पढ़ रहा था, जहां ildjarn
सुझाता है (0 बाद में स्वयं को सही किया गया) std::ifstream
std::istream_iterator
और std::search
के साथ फ़ाइल में डेटा खोजने के लिए सुझाव दिया गया है। मैं टिप्पणी करने वाला था कि आप ऐसा नहीं कर सकते हैं, क्योंकि search
फॉरवर्ड इटरेटर्स की अपेक्षा करता है, और istream_iterator
एक इनपुट इटरेटर है। लेकिन बस यह सुनिश्चित करने के लिए, मैंने यह कोशिश की:
std::istringstream iss("Elephant hats for sale.");
std::istream_iterator<char> begin(iss), end;
std::string sub("hat");
auto i = std::search(begin, end, sub.begin(), sub.end());
मुझे संकलन करने की उम्मीद नहीं थी, लेकिन ऐसा हुआ। हालांकि, परिणाम बेकार प्रतीत होते हैं क्योंकि यदि मैं इसका पालन करता हूं:
while(i != end)
{
std::cout << *i;
++i;
}
कोई आउटपुट नहीं है। तो, मेरा सवाल यह है: क्या मेरा संकलक पर istream_iterator
का उपयोग करके मेरी कॉल को अनुमति देने के लिए त्रुटि में है? या इस तरह की चीज को रोकने के कोई नियम नहीं हैं?
मेरी स्पष्ट गलती के बाद से; -] मैंने इनपुट उत्तरकर्ताओं के लिए एक रैपर (बूस्ट.पीरिट से) के लिंक के साथ अपना उत्तर अपडेट किया जो उन्हें आगे इटरेटर्स के रूप में उपयोग के लिए उपयुक्त बनाता है। – ildjarn