gpt4 book ai didi

c++ - 运行时错误 : map/set iterators incompatible

转载 作者:可可西里 更新时间:2023-11-01 16:29:27 24 4
gpt4 key购买 nike

我在第 8 行遇到运行时错误“map/set iterators incompatible”。

void Manager::Simulate(Military* military, Shalishut* shalishut,char* args[]){
Simulation* simulation = Simulation::GetInstance();
Time* time = Time::GetInstance();

multimap<int,Task*>::iterator itTasks;
itTasks = simulation->GetTasks().begin();
while(itTasks != simulation->GetTasks().end()){
while (itTasks->second->GetTimeStamp() == time->GetTime()){ /*line 8 - ERROR*/
TaskExecute(itTasks->second,military,shalishut,args);
itTasks++;
}
// Unit take car of vehicles
time->TimeIncrease();
}

}

Simulation被声明为 multimap<int,Task*> .有什么问题?

最佳答案

我要大胆猜测一下 Simulation::GetTasks()签名看起来像这样:

multimap<int,Task*> GetTasks() const;

这会在您每次调用它时创建一个新的多重映射(一个拷贝)。

比较迭代器时,multimap<int,Task*>迭代器必须来自同一个容器;因为每次调用 GetTasks() 都会得到一份新拷贝,你违反了这个约束,这是你错误的根源。您还有另一个问题 - 临时 multimap 拷贝在创建它们的语句后被销毁,因此您的迭代器立即失效。

你有两个选择;一种是在本地捕获一个拷贝并始终如一地使用该拷贝:

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()返回对持久 multimap 的引用,确保每次都使用相同的 multimap :

multimap<int,Task*> &GetTasks();

或常量引用:

const multimap<int,Task*> &GetTasks() const;

这样做的好处是避免了复制 multimap 的(可能很大的)开销。 .

请注意,使用 const 引用需要使用 const_iterator s 逐步通过 multimap 。我建议同时定义 const 和非 const 访问器(C++ 将根据 Simulation 指针或引用是否为 const 选择正确的访问器),除非您想禁止直接修改底层 multimap完全,在这种情况下,您只能定义 const变体。

关于c++ - 运行时错误 : map/set iterators incompatible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com