मैं एक जंगली अनुमान लेने के लिए जा रहा हूँ और कहते हैं कि Simulation::GetTasks()
हस्ताक्षर इस तरह दिखता है:
multimap<int,Task*> GetTasks() const;
यह एक नया मल्टीमैप (एक कॉपी) हर बार जब आप इसे कहते पैदा करता है।
इटरेटर की तुलना करते समय, multimap<int,Task*>
दोनों हीटर एक ही कंटेनर से आते हैं; चूंकि आप GetTasks()
पर कॉल करते समय हर बार एक नई प्रति प्राप्त कर रहे हैं, तो आप इस बाधा का उल्लंघन करते हैं, और यह आपकी त्रुटि का स्रोत है। आपको एक और समस्या भी है - अस्थायी मल्टीमैप प्रतियां उनके द्वारा बनाए गए बयान के बाद नष्ट हो जाती हैं, इसलिए आपके इटरेटर तुरंत अमान्य हो जाते हैं।
आपके पास दो विकल्प हैं;
multimap<int,Task*> &GetTasks();
:
multimap<int,Task*> tasks = simulation->GetTasks();
multimap<int,Task*>::iterator itTasks;
itTasks = tasks.begin();
while(itTasks != tasks.end()){
while (itTasks->second->GetTimeStamp() == time->GetTime()){
TaskExecute(itTasks->second,military,shalishut,args);
itTasks++;
}
// Unit take car of vehicles
time->TimeIncrease();
}
एक और GetTasks()
के लिए एक लगातार मल्टीमैप के लिए एक संदर्भ लौटने के लिए, यह सुनिश्चित करना ही एक हर बार इस्तेमाल किया जाता है: एक एक प्रति स्थानीय और उपयोग है कि लगातार नकल पर कब्जा करने की है
या एक स्थिरांक संदर्भ:
const multimap<int,Task*> &GetTasks() const;
यह (संभावित बड़े) की भूमि के ऊपर से बचने का लाभ दिया है multimap
की प्रतिलिपि बनाएँ।
ध्यान दें कि एक कॉन्स्ट संदर्भ का उपयोग करने के लिए const_iterator
एस का उपयोग मल्टीमैप के माध्यम से करने के लिए आवश्यक है। मैं दोनों कॉन्स और गैर-कॉन्स एक्सेसर्स को परिभाषित करने की अनुशंसा करता हूं (सी ++ Simulation
पॉइंटर या संदर्भ कॉन्स के आधार पर सही विकल्प चुनता है), जब तक कि आप अंतर्निहित multimap
पूरी तरह से प्रत्यक्ष संशोधन को अस्वीकार नहीं करना चाहते हैं, इस स्थिति में आप केवल परिभाषित कर सकते हैं const
संस्करण।
क्या आप कोड को दोबारा सुधार सकते हैं ताकि यह पठनीय हो और टैग में आप जिस भाषा के बारे में बात कर रहे हों उसे निर्दिष्ट कर सकें? यह आपको बहुत जल्दी उत्तर देने में मदद करेगा। – rfunduk
सी ++ भाषा – user454563
'सिमुलेशन' एक मल्टीमैप नहीं है - मल्टीमैप में 'GetTasks() 'सदस्य फ़ंक्शन नहीं है। – bdonlan