2

我很好奇推回向量是如何工作的。我想要一种方法来推回一个元素,然后能够将它在向量中的位置添加到作为一种地图类型的双精度数组中。

像这样的东西:

// Create a bomb
Bomb b;
b.currentTime = SDL_GetTicks();
b.explodeTime = SDL_GetTicks() + 3000;
b.owner = player;
b.power = 2;    
b.x = x;
b.y = y;

bombVec.push_back(b);

bombs[y][x] = THIS_IS_WHAT_I_WANT;

这样当我引爆炸弹时,我可以查看地图,然后在向量中有一个 ID 来处理。每个非炸弹方块都会有一个-1。另外,只是好奇。想象一下,我在一个向量中有 3 个元素。我删除第二个,然后添加另一个。新元素是否与被删除的元素位于同一位置?

谢谢!

4

2 回答 2

5

在你之后push_back,你可以使用back来获取元素。

Bomb b;
...
bombVec.push_back(b);
Bomb &bref = bombVec.back();

还是你想要索引?

强制警告:如果你推入另一个项目,并且容量不够大,向量将被调整大小。如果访问引用,这将使引用无效并导致程序错误。这不是问题(1)通过索引访问(2)如果指针存储在vector(3)如果你使用list而不是(4)如果你不调整vector.

获取索引:

size_t index = bombVec.size();
bombVec.push_back(b);
于 2012-05-30T22:40:09.630 回答
0

让我们从头开始:

另外,只是好奇。想象一下,我在一个向量中有 3 个元素。我删除第二个,然后添加另一个。新元素是否与被删除的元素位于同一位置?

删除在语言中具有精确的含义,在这种情况下没有意义,所以我假设您的意思是从容器中删除。当你从一个向量中擦除一个元素时,所有索引大于被擦除元素的元素都会被移动(或复制)以填充被擦除元素留下的空白空间。如果你push_back一个新元素,那个元素会被添加到容器的后面,所以它不会占据相同的位置。

另一种选择不是擦除原始元素,而是将新元素写入旧元素所在的位置:v[ idx ] = new_value;. 这将我们带到问题的第一部分:

我想要一种方法来推回一个元素,然后能够将它在向量中的位置添加到作为一种地图类型的双精度数组

使用向量作为底层容器的问题是容器上的任何变异操作都会使迭代器和对存储元素的引用无效。例如,erase上述内容将使迭代器和指向具有更大索引的所有元素的指针无效(从技术上讲,它根据标准使所有迭代器无效,但实际上......)。向容器中添加元素可能会更糟,因为如果向量需要增长,它实际上会使所有迭代器/引用无效。

一个常见的建议替代方法是保持元素位置的索引。虽然如果容器增长,索引是稳定的,但如果从容器中删除,它们将引用错误的位置,因此您需要小心操作方式。如果您可以设法不从向量中删除元素(例如添加一个标记,将炸弹标记为已删除但实际上并未将其从容器中删除),那么问题就会变得简单得多。

于 2012-05-30T23:18:15.863 回答