C ++多维向量追加

时间:2014-07-04 20:51:26

标签: c++ arrays vector multidimensional-array

我们说我有一个2D矢量:

std::vector<std::vector<int>> world;

我想实现这样的目标:

world[0][0] = x;
world[0][1] = y;
etc

所以我想出了这个功能:

int Controller::AddBody(SDL_Rect RECT, SDL_Color COLOR)
{
    world[world.size() + 1].push_back(RECT.x);
    world[world.size() + 1].push_back(RECT.y);
    world[world.size() + 1].push_back(RECT.w);
    world[world.size() + 1].push_back(RECT.h);
    world[world.size() + 1].push_back(COLOR.r);
    world[world.size() + 1].push_back(COLOR.g);
    world[world.size() + 1].push_back(COLOR.b);
    world[world.size() + 1].push_back(COLOR.a);

    return world.size() + 1;
}

但是这会产生异常。我无法理解为什么?

2 个答案:

答案 0 :(得分:2)

这是使用C ++ 11中添加的新emplace方法和initializer list的接受答案的更现代的方法:

int Controller::AddBody(SDL_Rect RECT, SDL_Color COLOR)
{
     world.emplace_back(std::vector<int>{
        RECT.x, 
        RECT.y, 
        RECT.w, 
        RECT.h, 
        COLOR.r, 
        COLOR.g, 
        COLOR.b, 
        COLOR.a
    });
    return world.size() + 1;
}

Live demo

答案 1 :(得分:1)

world [world.size()+ 1]将指向向量的结尾(一个超出world.end())。

回顾一下你的世界矢量真正代表的东西:矢量矢量。 因此,对于world []向量中的每个新条目,您需要添加一个新向量。

代码应如下所示:

int Controller::AddBody(SDL_Rect RECT, SDL_Color COLOR)
{
    std::vector<int> newVec;

    newVec.push_back(RECT.x);
    newVec.push_back(RECT.y);
    newVec.push_back(RECT.w);
    newVec.push_back(RECT.h);
    newVec.push_back(COLOR.r);
    newVec.push_back(COLOR.g);
    newVec.push_back(COLOR.b);
    newVec.push_back(COLOR.a);
    world.push_back(newVec);

    return world.size();
}

请记住,使用std :: vector时,[]运算符只允许访问数组中已存在的元素。因此,如果您的数组只有3个元素,并且您尝试设置第4个元素,那么您将获得异常。您总是必须调整向量的大小或将新元素推入向量以创建新元素。