获取您刚刚推送到矢量C++中的元素的位置

Get location of element you just pushed into vector C++

本文关键字:C++ 元素 位置 获取      更新时间:2023-10-16

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

像这样:

// 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 个元素。我删除第二个,然后添加另一个。新元素是否与已删除的元素位于同一位置?

谢谢!

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

让我们从最后开始:

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

删除在语言中具有确切的含义,在这种情况下毫无意义,因此我假设您的意思是从容器中删除。从矢量中擦除元素时,索引大于擦除元素的所有元素都将移动(或复制),以填充擦除元素留下的空白区域。如果push_back一个新元素,则该元素将添加到容器的背面,因此它不会占用相同的位置。

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

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

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

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