【发布时间】:2021-01-20 15:36:21
【问题描述】:
在我的应用程序中,我有一个可以包含 Agent 对象的 2D Environment。为了简化计算,我的环境由两种数据结构组成:
-
Agent*** grid表示 2D 指针网格(如果代理位于某个位置,则有指向它的指针,否则为nullptr)。 -
std::vector<Agent*> agents表示环境中的代理列表。当我需要更新代理时,我使用此数据结构来防止遍历整个网格。
每次我更新整个环境时,我都想根据一个标准从环境中删除我的一部分代理。因此,我想从上面描述的两个数据结构中删除代理,然后释放代理内存。另外,为了最大限度地提高效率,由于agents 可能是一个非常大的向量,我想在一个循环中执行删除和delete。
我的以下(和不正确的)方法如下:
void Environment::removeDeadAgents(){
std::vector<Agent*>::iterator it = agents.begin();
while(it != agents.end()){
Agent* a = (*it);
if(!a->isAlive()){
grid[a->getY()][a->getX()] = nullptr;
delete *it;
it = agents.erase(it);
}else{
it++;
}
}
我错过了什么?
【问题讨论】:
-
你说你的方法不正确,具体是什么症状?您可以在这里按要求提供minimal reproducible example 吗?
-
无关:随便看看,你会发现整个 Internet 站点都专门用来嘲笑三星级程序员。
-
我凭经验发现每次使用三指针时,几乎都是因为我的设计不好。
-
注意:这里有什么东西很容易出错。您是否考虑过使用智能指针?
shared_ptr和weak_ptr会更合适,但我认为你可以使用vector拥有的unique_ptrs 来做到这一点。 -
另外,为了最大限度地提高效率,由于代理可能是一个非常大的向量,我想在一个循环中执行删除和删除。 -- 你的方法不是完全最优。每次调用
erase,都必须缩小大向量。有很多更好的方法可以做到这一点而无需花费(直到最后)。
标签: c++ pointers iterator stdvector