初学者程序员在这里;我为这个长期问题提前道歉。
我成功地创建了一个包含向量的向量并填充每个向量。这个想法适用于一个小型运动模拟游戏,一个人可以雇用多达五名侦察员,而侦察员最多可以提供五个他已经审查过的玩家。
这是主要载体:
vector <vector<Player*> > MainVector;
以下是主要内容中的向量:
vector<Player*> SubVector;
SubVectors(最终将包含播放器对象)在MainVector内生成:
for(int i = 0; MainVector.size() < 5; i++)
{
MainVector.push_back(SubVector);
}
每当我雇用Scout时,它会用他的玩家对象填充五个SubVectors中的一个(见下文):
for (int i = 0; i < ScoutsStable[scoutPick]->getScoutPlayerAmount(); ++i)
{
MainVector[scoutPick].push_back (new Player());
Player instance;
}
我需要一个主向量来保存子向量的原因是,如果我执行一个动作,我需要能够一次删除或擦除玩家对象的组(或子向量)。但我也需要能够删除或删除每个子矢量中的单个元素(包含单个播放器对象)。
在我雇用了一些侦察兵之后,我可以在每个SubVectors中看到玩家对象,所以这很好用:
for (int i=0; i < ScoutsStable[x]->getScoutPlayerAmount(); ++i)
{
dxTrajanFont25->print (MainVector[number][i]->getPlayerName(),positionX,positionY);
dxTrajanFont25->print (stringConverter(MainVector[number][i]->getPlayerAge()),positionX += 95,positionY);
}
我可以成功删除Scout(从他自己的Vector中删除他)并删除相应的Player对象SubVector:
ScoutsStable.erase (ScoutsStable.begin() + staffNumber);
MainVector.erase (MainVector.begin() + staffNumber);
这也很有效。
但是当我去重新侦察侦察兵时,我得到“下标超出范围”错误。我认为这可能是因为我正在从MainVector中删除SubVector - 但是如果MainVector.size()降到5以下,我有函数(见上文)push_back一个新的SubVector。所以MainVector总是保持5个元素。
我不确定我错过了什么?
第二个简单的问题是,有人可以帮我解决删除SubVector中特定玩家对象的确切语法吗?
当我尝试使用以下命令从存储在MainVector元素0(例如)中的SubVector中删除Player对象时:
MainVector[0].erase (MainVector[0].begin() + selection);
我收到“Vector Iterator + Offset Out of Range”错误消息。我确定这是因为我的语法不正确。
当我尝试访问SubVector本身时,我收到编译器错误。
SubVector[0].erase (SubVector[0].begin() + selection);
我应该如何改写该语句,以便删除特定SubVector中的特定播放器对象?
提前感谢您的任何答案 - 非常感谢,因为这是我需要做的最后一件事,让这个小项目成为现实!
答案 0 :(得分:2)
因此,如果我理解正确,你会有一个向量的向量,其中包含指向玩家对象的指针。
只是一个建议,但你也可以输入定义长模板初始化,以获得更多抽象和更高的可读性。
无论如何,尝试删除矢量中的项目,如下所示:
vec.erase(&vec[index]);
此措辞可确保您知道要删除的元素的特定内存地址。
另外,你最有可能循环出索引。
最后,创建函数不仅可以对数据结构执行删除操作,还可以释放指针,以确保没有内存泄漏。