2011-04-30 11 views
5

क्या दो पुनरावृत्तियों की तुलना करना संभव है?इटरेटर्स की तुलना करें, सी ++

Assertion failed: Vector iterators incompatible... 

वहाँ तुलना के किसी भी अन्य रास्ता नहीं है: एक एसटीडी का उपयोग कर तुलना :: मिनट

void change (typename TList <Item *>::Type ::iterator it_begin, typename TList <Item*>::Type ::iterator it_end) 
{ 
    .... 
this->items.resize (index); 
    std::sort (it_begin, std::min (it_end, it_begin += index - 1); //Compare two iterators, exception 
.... 
} 

निम्नलिखित अपवाद फेंकता है?

+0

'TList :: प्रकार' और 'यह-> आइटम' के प्रकार क्या हैं? क्या इटरेटर 'इस-> आइटम' में इंगित करते हैं? –

उत्तर

14

हां। लेकिन मुझे संदेह है कि क्या आप std::min के साथ ऐसा कर सकते हैं।

आप दो पुनरावृत्तियों के बीच की दूरी की गणना करने के लिए std::distance फ़ंक्शन का उपयोग कर सकते हैं। और फिर आप यह निर्धारित करने के लिए दूरी का उपयोग कर सकते हैं कि इटेटरेटर छोटा है। एक बार जब आप छोटे पुनरावर्तक को जानते हैं, तो आप इसे std::sort फ़ंक्शन पर भेज सकते हैं।

यहाँ small illustration how to calculate distance है:

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() { 
    std::vector<int> v(100); //vector of size 100 
    std::cout <<(std::distance(v.begin(), v.begin() + 10))<< std::endl; 
    std::cout <<(std::distance(v.begin() +25, v.begin() +10))<< std::endl; 
} 

आउटपुट:

10 
-15 

आशा है कि आप पर्याप्त विचार है कि तुम क्या चाहते हो करने के लिए आगे बढ़ने के तरीके देता है।

+5

"और फिर आप दूरी का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि इटेटरेटर छोटा है।" असत्य। "व्यवहार अनिश्चित है अगर आखिरी बार (संभवतः बार-बार) पहले से बढ़ने से पहले पहुंच योग्य नहीं है।" –

+0

मुझे लगता है कि अगर आप वास्तव में [यादृच्छिक अभिगम iterators] (http://en.cppreference.com/w/cpp/concept/RandomAccessIterator) हैं तो आप केवल यह करना चाहते हैं। चूंकि वे इटरेटर हैं जो तुलना ऑपरेशन का समर्थन करते हैं। – Aleksei

+1

म्यूइंग डक: सी ++ 11 से पहले। चूंकि सी ++ 11 यह है यदि इनपुट यह RandomAccessIterator है, तो व्यवहार पहले से पहले पहुंचने योग्य नहीं है और पहले अंतिम से पहुंच योग्य नहीं है। – xofon

2

resize पर कॉल करने के बाद, आपके सभी मौजूदा इटरेटर अमान्य हैं।

इसके अलावा, वह पंक्ति अपरिभाषित व्यवहार का आह्वान करती है, क्योंकि आप दोनों अनिश्चित आदेश में it_begin बदल रहे हैं और इसे पढ़ रहे हैं।

3

प्रश्न का उत्तर देने के लिए, std :: distance() का उपयोग शुरू() iterator की दूरी को मापने के लिए किया जा सकता है, और इन दूरीों की तुलना तब की जा सकती है। हालांकि, जैसा कि बेन द्वारा इंगित किया गया है, आपके कोड के साथ अन्य समस्याएं हैं। http://www.cplusplus.com/reference/std/iterator/distance/

1

पुस्तक C++ Primer 5th Ed में देखें। पी .111 सेक्शन 3.4.2 इटरेटर अंकगणित कहते हैं,

हम किसी भी लाइब्रेरी कंटेनर में मान्य इटरेटर्स की तुलना करने के लिए == और! = का उपयोग कर सकते हैं।

अनुभाग भी हमें बताता है कि स्ट्रिंग और वेक्टर समर्थन संबंधपरक ऑपरेटर के लिए iterators (उर्फ अंकगणित iterator) जिसमें शामिल>,> =, <, < =।