我们说我有一个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;
}
但是这会产生异常。我无法理解为什么?
答案 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;
}
答案 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个元素,那么您将获得异常。您总是必须调整向量的大小或将新元素推入向量以创建新元素。