2012-05-12 16 views
6

नीचे कोड के लिए के लिए, मैं रेखा के लिए शीर्षक में त्रुटि हो रही हैत्रुटि: "ऑपरेटर + के लिए कोई मुकाबला नहीं", सूची इटरेटर

while((*(It2 + code)).exists){ 


void locatetohashtable(std::list<Element> elist, 
         int *m,std::list<Element>& table, 
         std::list<std::string>& keylist) 
{   
    std::list<Element>::iterator It2=table.begin(); 
    int i=0; 
    int k=0; 
    std::list<Element>::iterator It; 
    for(It = elist.begin(); It != elist.end(); ++It) 
    { 
     int code=hash_func(stringIntValue((*It).name),*m,i); 
     while((*(It2 + code)).exists){ 
      i++; 
     } 
     table.insert(*(It2+i), (*It)); 
     keylist.insert(keylist.begin(),(*It).name); 
     k++; 
    } 
} 

मैं एक ही नहीं मिल रहा है ++It

के लिए त्रुटि क्या समस्या है?

उत्तर

11

std::list के लिए iterator बिडरेक्शनल है, इसलिए यह +(int) का समर्थन नहीं करता है। एकमात्र समर्थित चाल संचालन ++ और -- हैं।

4

std::list इटेटर केवल बोली-प्रक्रियात्मक हैं, यादृच्छिक पहुंच नहीं है, इसलिए आप उन्हें अग्रिम करने के लिए ऑपरेटर + का उपयोग नहीं कर सकते हैं। इसके बजाए std::next (सी ++ 11) या std::advance का उपयोग करें।

9

ऐसा इसलिए है क्योंकि std::list के iterators bidirectional iterators हैं, इसलिए वे आपके द्वारा किए जाने वाले अतिरिक्त ऑपरेशन का समर्थन नहीं करते हैं। व्यावहारिक रूप से, ऐसा इसलिए है क्योंकि इसे एक कुशल संचालन के रूप में लागू नहीं किया जा सकता है, क्योंकि सूचियां यादृच्छिक पहुंच प्रदान नहीं करती हैं, इसलिए आपको प्रारंभिक पुनरावर्तक से लक्ष्य एक में एकल वृद्धि में कदम उठाना होगा। डिज़ाइन का निर्णय एक ऑपरेशन प्रदान नहीं करना है जो अक्षम होगा।

आप अपनी खुद की वृद्धि लूप लिखने से बचने के लिए std::advance या std::next का उपयोग कर सकते हैं, लेकिन हुड के नीचे यह चरण-दर-चरण बढ़ेगा।

2

यह "अवधारणा" का विषय है।

list केवल कुशलतापूर्वक forward and backward पर जा सकता है, इस प्रकार इसके इटरेटर बिडरेक्शनल इटरेटर अवधारणा का मॉडल करते हैं।

आप या तो कई बार कई स्थितियों से इसे स्थानांतरित करने के लिए std::advance का उपयोग कर सकते हैं, हालांकि यह कुशल नहीं होगा।

या आप सूची के बजाय vector या deque का उपयोग करने के लिए बदल सकते हैं। चूंकि वे रैंडम एक्सेस कंटेनर हैं, इसलिए उनके इटरेटर कुशलतापूर्वक अतिरिक्त और घटाव का समर्थन करते हैं।

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