初级程序员在这里;对于这个冗长的问题,我提前表示歉意。
我成功地创建了一个包含 vector 的 vector 并填充了每个 vector 。这个想法是针对一个小型运动模拟游戏,一个人最多可以雇用五名球探,而该球探最多可以展示他评价过的五名球员。
这是主要的载体:
vector <vector<Player*> > MainVector;
下面是进入 main 的 vector :
vector<Player*> SubVector;
SubVectors(最终将包含玩家对象)在 MainVector 内部生成:
for(int i = 0; MainVector.size() < 5; i++)
{
MainVector.push_back(SubVector);
}
每当我雇佣一个 Scout 时,它就会用他的玩家对象填充五个 SubVector 之一(见下文):
for (int i = 0; i < ScoutsStable[scoutPick]->getScoutPlayerAmount(); ++i)
{
MainVector[scoutPick].push_back (new Player());
Player instance;
}
我需要一个主 vector 来保存子 vector 的原因是,如果我执行一个 Action ,我需要能够一次移除或删除一组(或子 vector )玩家对象。但我还需要能够移除或删除每个子 vector 中的单个元素(包含单个玩家对象)。
在我雇佣了一些侦察员之后,我可以在每个 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,则推回一个新的 SubVector。因此 MainVector 始终保持在 5 个元素。
我不确定我错过了什么?
第二个快速问题是有人可以帮助我了解在 SubVector 中删除特定玩家对象的确切语法吗?
当我尝试从存储在 MainVector 元素 0 中的 SubVector 中删除播放器对象时(例如)使用:
MainVector[0].erase (MainVector[0].begin() + selection);
我收到“vector 迭代器 + 偏移量超出范围”错误消息。我确定这是因为我的语法不正确。
当我尝试访问 SubVector 本身时出现编译器错误。
SubVector[0].erase (SubVector[0].begin() + selection);
我应该如何改写该语句,以便我可以删除特定 SubVector 中的特定玩家对象?
提前感谢您的任何回答 - 非常感谢,因为这是我完成这个小项目所需要做的最后一件事!
最佳答案
所以如果我理解正确的话,你有一个充满 vector 的 vector , vector 中充满了指向玩家对象的指针。
只是一个建议,但您也可以使用 typedef 长模板初始化以获得更多抽象和更好的可读性。
无论如何,尝试像这样删除 vector 中的项目:
vec.erase(&vec[index]);
这种写法确保你知道你要删除的元素的具体内存地址。
此外,您很可能会循环出索引。
最后,创建不仅对数据结构执行删除操作而且释放指针的函数,以确保没有内存泄漏。
关于c++ - vector 中的 vector - 更改特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21919596/