矢量中的矢量-更改特定元素

Vectors Within Vectors - Changing Specific Elements

本文关键字:元素      更新时间:2023-10-16

这里是初级程序员;我为这个长问题提前道歉。

我成功地创建了一个包含向量的向量,并填充了每个向量。这个想法是为了制作一个小型体育模拟游戏,一个人最多可以雇佣五名球探,而该球探最多可以展示他审查过的五名球员。

以下是主要矢量:

vector <vector<Player*> > MainVector;

下面是进入主通道的矢量:

vector<Player*> SubVector;

子矢量(最终将包含玩家对象)在这里的MainVector内部生成:

for(int i = 0; MainVector.size() < 5; i++)
{
MainVector.push_back(SubVector);
}

每当我雇佣Scout时,它就会用他的玩家对象填充五个子向量中的一个子向量(见下文):

for (int i = 0; i < ScoutsStable[scoutPick]->getScoutPlayerAmount(); ++i)
{
MainVector[scoutPick].push_back (new Player());
Player instance;
}

我需要一个主向量来保存子向量的原因是,如果我执行一个动作,我需要一次移除或擦除一组(或子向量)播放器对象的能力。但我也需要删除或擦除每个子向量中的单个元素(包含单个播放器对象)的能力。

在我雇佣了一些侦察员后,我可以看到每个子矢量中的玩家对象,所以这很好:

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中删除他),并删除他对应的玩家对象的SubVector:

ScoutsStable.erase (ScoutsStable.begin() + staffNumber);
MainVector.erase (MainVector.begin() + staffNumber);

这也很有效。

但当我重新雇佣一名侦察员时,我会收到"下标超出范围"的错误。我想这可能是因为我正在从MainVector中删除SubVector,但如果MainVector.size()降到5以下,我有一个函数(见上文)push_back一个新的SubVector。因此MainVector始终保持在5个元素。

我不确定我错过了什么?

第二个快速问题是,有人能帮我了解删除SubVector中特定Player对象的确切语法吗?

当我尝试使用从存储在MainVector元素0中的SubVector中删除播放器对象时(例如)

MainVector[0].erase (MainVector[0].begin() + selection);

我收到一条"矢量迭代器+偏移超出范围"的错误消息。我确信这是因为我的语法不正确。

当我尝试访问SubVector本身时,我会遇到编译器错误。

SubVector[0].erase (SubVector[0].begin() + selection);

我应该如何改写该语句,以便删除特定SubVector中的特定Player对象?

提前感谢您的回答-非常感谢,因为这是我完成这个小项目所需要的最后一件事!

如果我理解正确的话,你有一个向量,里面充满了指向玩家对象的指针。

这只是一个建议,但您也可以对长模板初始化进行typedef,以获得更多抽象和可读性。

无论如何,试着像这样删除向量中的项目:

vec.erase(&vec[index]);

此措辞确保您知道要删除的元素的特定内存地址。

另外,您很可能循环出索引。

最后,创建一些函数,这些函数不仅可以对数据结构执行删除操作,还可以释放指针,以确保没有内存泄漏。