获取您刚刚推送到矢量C++中的元素的位置
Get location of element you just pushed into vector C++
我很好奇推回向量是如何工作的。我想要一种方法来推回一个元素,然后能够将其在向量中的位置添加到作为地图类型的双精度数组中。
像这样:
// 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
将使迭代器和指向所有具有更大索引的元素的指针无效(从技术上讲,它根据标准使所有迭代器无效,但在实践中......向容器添加元素可能会更糟,因为如果向量需要增长,它实际上可以使所有迭代器/引用无效。
一个常见的建议替代方法是保留元素位置的索引。虽然如果容器增长,索引是稳定的,但如果从容器中删除,它们将引用错误的位置,因此您需要小心操作方式。如果您可以设法不从矢量中删除元素(例如添加一个标志,将炸弹标记为已删除,但实际上没有将其从容器中删除),那么问题就会变得简单得多。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 擦除while循环中迭代的元素