多维向量追加

C++ Multidimensional Vectors Appending

本文关键字:追加 向量      更新时间:2023-10-16

假设我有一个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;
}
但是

会创建一个异常。我不明白为什么?

这是使用c++ 11中添加的新放置方法和初始化器列表来获得可接受答案的更现代的方法:

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;
}

现场演示

world[world.size() + 1]将指向vector的末尾(比world.end()多一个)。

回头看看你的世界向量真正代表了什么:向量的向量。所以对于你的世界[]向量中的每一个新条目,你想要添加一个新的向量。

代码应该是这样的:
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个元素,你就会得到一个异常。你必须要么调整vector的大小,要么将一个新元素推入vector以创建一个新元素。