Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取刚刚推入向量C+的元素的位置+;_C++_Vector - Fatal编程技术网

C++ 获取刚刚推入向量C+的元素的位置+;

C++ 获取刚刚推入向量C+的元素的位置+;,c++,vector,C++,Vector,我很好奇推回向量是如何工作的。我想要一种方法来推回一个元素,然后能够将它在向量中的位置添加到一个用作映射类型的双数组中 大概是这样的: // 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][

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

大概是这样的:

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


谢谢

向后推
之后,可以使用
向后推
获取元素

Bomb b;
...
bombVec.push_back(b);
Bomb &bref = bombVec.back();
还是你想要索引

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

获取索引:

size_t index = bombVec.size();
bombVec.push_back(b);

让我们从结尾开始:

还有,只是好奇。假设向量中有3个元素。我删除第二个,然后添加另一个。新元素是否与删除的元素位于同一位置

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

另一个选项不是擦除原始元素,而是将新元素写入旧元素所在的位置:
v[idx]=new_值。这就引出了问题的第一部分:

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

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


建议的一种常见替代方法是将索引保留到元素的位置。虽然如果容器增长,索引是稳定的,但是如果从容器中擦除,索引将指向错误的位置,因此您需要小心操作。如果您可以设法不从向量中删除元素(例如添加标记炸弹已删除但未实际从容器中删除的标志),则问题会变得简单得多。

从向量中删除不是一个好主意。它要求所有元素都要移动。不,它不会插入到另一个已删除的位置,而是始终插入到数组的末尾。您可能想看看
list
@StevenBurnap,它是最后一个元素的迭代器,而不是最后一个元素本身
*bombVec.rbegin()
或其他
bombVec.back()
将是最后一个元素。使用它的索引将是
bombVec[bombVec.size()-1]
当然你可以从向量中删除…这没有什么错。如果您永远无法从中删除任何内容,那么它将是一种非常无用的数据类型!现在,如果您正在研究一种需要非常高效的算法,那么对向量进行一系列的添加/删除调用是个坏主意……因为是的,删除需要移动其他元素。但是从向量中删除一个对象绝对没有错。a有更多的答案,我需要索引。谢谢是的,我将确保向量永远不会被调整大小。如果我保留15个元素,虽然一次创建的元素超过15个,但不超过10个,这是否仍然会阻止调整大小?是的,这将阻止调整大小。谢谢Dietrich。非常有用。强制性警告(扩展):如果元素从向量中删除,并且基本上每当操作修改容器时,引用也会变得无效。@DavidRodríguez dribeas索引呢?