【问题标题】:Vectors Within Vectors - Changing Specific Elements向量中的向量 - 更改特定元素
【发布时间】: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()(即使有,你使用的是点运算符而不是-&gt; 作为deref)。
  • 感谢您的评论,WhozCraig。我已经编辑了我的问题,以删除试图从两个不同容器中擦除的第一个错误位。我仍然不清楚如何从其中一个子向量中的元素中删除播放器对象。我可能需要详细了解这一切。
  • This may help。这并不多,但它应该会促使你朝着正确的方向前进。

标签: c++ vector


【解决方案1】:

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

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

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

vec.erase(&amp;vec[index]);

这种措辞确保您知道要删除的元素的具体内存地址。

另外,你很可能会跳出索引。

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

【讨论】:

  • 感谢您的回复!所以:vec.erase(&amp;vec[index]); 在我的例子中的语法是 SubVector.erase(&amp;SubVector[index]); 吗? index 是我用来告诉我要擦除的 SubVector 中的哪个元素的变量吗?抱歉,我想弄清楚这一切。
  • 抱歉,我不小心按了Enter。为了澄清,我已经扩展了评论。
  • @DJames 哦。行。是的,这就是它的使用方法。
  • 我一定还是遗漏了什么。使用这个SubVector.erase(&amp;SubVector[0]);,我似乎无法通过编译器。我收到以下错误:Error 21 error C2664: 'std::_Vector_iterator&lt;_Myvec&gt; std::vector&lt;_Ty&gt;::erase(std::_Vector_const_iterator&lt;_Myvec&gt;)' : cannot convert parameter 1 from 'Player **' to 'std::_Vector_const_iterator&lt;_Myvec&gt;'
  • 对此的回应非常晚,但今天发现您关于我循环出索引的注释是正确答案。我不知何故错过了 - 根据控制向量以前应该有多少元素的参数来控制循环,而不是像我通常那样使用 size() 命令。谢谢你,特恩特!
猜你喜欢
  • 2011-02-07
  • 2011-02-07
  • 2019-04-18
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多