【发布时间】:2014-02-20 21:06:19
【问题描述】:
这里是初级程序员;我提前为这个冗长的问题道歉。
我已经成功地创建了一个包含向量并填充每个向量的向量。这个想法是针对一个小型体育模拟游戏,一个人最多可以雇佣 5 名球探,并且该球探最多可以展示他审查过的 5 名球员。
这里是主向量:
vector <vector<Player*> > MainVector;
这里是进入 main 的向量:
vector<Player*> SubVector;
SubVectors(最终将包含播放器对象)在 MainVector 内部生成:
for(int i = 0; MainVector.size() < 5; i++)
{
MainVector.push_back(SubVector);
}
每当我雇佣一个侦察兵时,它就会用他的玩家对象填充五个子向量之一(见下文):
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 中删除他)并删除他对应的 Player 对象的 SubVector:
ScoutsStable.erase (ScoutsStable.begin() + staffNumber);
MainVector.erase (MainVector.begin() + staffNumber);
这也很好用。
但是,当我重新雇用侦察员时,我收到“下标超出范围”错误。我认为这可能是因为我正在从 MainVector 中删除 SubVector - 但是如果 MainVector.size() 低于 5,我有函数(见上文)push_back 一个新的 SubVector。所以 MainVector 始终保持在 5 个元素。
我不确定我错过了什么?
第二个快速问题是有人可以帮助我了解删除子向量中特定播放器对象的确切语法吗?
当我尝试从存储在 MainVector 元素 0(例如)中的 SubVector 中删除播放器对象时,使用:
MainVector[0].erase (MainVector[0].begin() + selection);
我收到“向量迭代器 + 偏移超出范围”错误消息。我确定这是因为我的语法不正确。
当我尝试访问 SubVector 本身时出现编译器错误。
SubVector[0].erase (SubVector[0].begin() + selection);
我应该如何改写该语句,以便删除特定子向量中的特定播放器对象?
提前感谢您的任何回答 - 非常感谢,因为这是完成这个小项目所需的最后一件事!
【问题讨论】:
-
第二个问题的第一部分是错误的,因为您使用来自一个容器的迭代器作为完全不同容器中的擦除点。第二个是尝试将
selection元素推进到MainVector[0].begin()的临时副本,错误是因为容器中至少没有selection元素。听起来您需要处理所有权和/或保持向量同步。第三个,SubVector[0]是一个Player*,所以它自然没有begin()(即使有,你使用的是点运算符而不是->作为deref)。 -
感谢您的评论,WhozCraig。我已经编辑了我的问题,以删除试图从两个不同容器中擦除的第一个错误位。我仍然不清楚如何从其中一个子向量中的元素中删除播放器对象。我可能需要详细了解这一切。
-
This may help。这并不多,但它应该会促使你朝着正确的方向前进。