C ++将向量的一个元素放到另一个向量中

时间:2013-06-22 19:29:12

标签: c++ class vector copy sdl

我正在使用SDL进行RTS游戏。我有一个木头类,其对象将收集附近树木的木材。在类中我创建了一个名为temp_trees的向量,并且作为构造函数的参数,我使用了传入的树对象向量。

木场建造者:

woodyard::woodyard(int x, int y, int HP, int id, vector<Tree> trees)
{
...
vector<Tree> temp_trees;
for(int i = 0; i < trees.size(); i++)
{
    if((trees[i].xPos - 100) / 50 >= x - 5 && (trees[i].xPos - 100) / 50 <= x + 4)
    {
        if((trees[i].yPos - 100) / 50 >= y - 5 && (trees[i].yPos - 100) / 50 <= y + 4)
        {
            temp_trees.push_back(trees[i]);
        }
    }
}

collect_control = 0;
no = 0;
}

collect_wood函数:

void woodyard::collect_wood(){
if(no == 5)
{
 temp_trees[collect_control].drewno -= 1;
 if(temp_trees[collect_control].drewno <= 0){
 collect_control++;
 temp_trees.erase(temp_trees.begin());
}}


no++;
if(no >= 10){
  no = 0;
}}

程序在启动后崩溃。 任何人都可以在此代码中看到任何错误吗?

PS:我认为在构造函数中将元素从一个向量加到另一个向量可能有问题。

2 个答案:

答案 0 :(得分:0)

构造函数不包含任何非法操作。

而collect_wood()虽然难以理解,却没有明显的理由使其崩溃。

collect_control的价值是多少?你检查它是< temp_trees.size()吗?意识到temp_trees.size()因为你正在删除元素而不断变化。

擦除后可能不会递增collect_control:所有元素都会向后移位,并且擦除后的collect_control已经指向下一个元素。

注意:考虑temp_trees.erase(temp_trees.begin());是使用向量可以做的最低效的事情之一(删除第一个元素)。

答案 1 :(得分:0)

在woodyard构造函数中,您声明了一个临时的,函数范围的变量“temp_trees”。

woodyard::woodyard(int x, int y, int HP, int id, vector<Tree> trees)
{
...
vector<Tree> temp_trees;

如果你有一个名为temp_trees的向量成员,则此声明将隐藏它。所以你的成员函数没有看到相同的向量:

void woodyard::collect_wood(){
if(no == 5)
{
 temp_trees[collect_control].drewno -= 1;

另外,在没有看到其余代码的情况下,我不知道你是如何确保向量中至少有“collect_control”成员。

#include <assert.h>
...
assert(collect_control < temp_trees.size());

或者如果你正在使用visual studio,你可以

if(collect_control >= temp_trees.size())
    DebugBreak();

“size()”是一个基于1的值,但数组索引运算符是基于零的。这意味着,当向量中有一个条目时,它将是向量[0]。如果向量为空,vector [0]是非法的 - 它不存在。并且空白用大小为0表示。大小必须始终大于您尝试访问的元素索引。