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

时间:2014-02-20 21:06:20

标签: c++ vector

初学者程序员在这里;我为这个长期问题提前道歉。

我成功地创建了一个包含向量的向量并填充每个向量。这个想法适用于一个小型运动模拟游戏,一个人可以雇用多达五名侦察员,而侦察员最多可以提供五个他已经审查过的玩家。

这是主要载体:

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中的特定播放器对象?

提前感谢您的任何答案 - 非常感谢,因为这是我需要做的最后一件事,让这个小项目成为现实!

1 个答案:

答案 0 :(得分:2)

因此,如果我理解正确,你会有一个向量的向量,其中包含指向玩家对象的指针。

只是一个建议,但你也可以输入定义长模板初始化,以获得更多抽象和更高的可读性。

无论如何,尝试删除矢量中的项目,如下所示:

vec.erase(&vec[index]);

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

另外,你最有可能循环出索引。

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