std::vector push_back()擦除上一个元素

std::vector push_back() erases previous element

本文关键字:擦除 元素 上一个 back vector push std      更新时间:2023-10-16

我有一个类"地形"(每一个特殊函数都被定义了——我很绝望)

所以,当我一个接一个地定义对象时,一切都很好,但当涉及到多个对象时,它是无效的。所以我做了一个std::矢量的地形。

std::vector<terrain> defined_terrains;

一切看起来都很好,我有一个函数可以打印对象的所有内容。所以我做了:

defined_terrains.push_back({args...})
defined_terrains[0].print_data();

上面的代码是这样工作的:

  /// push_back starts 
COPY CSTR: object test 1
DSTR: object test 1
  /// push_back finishes
  /// print_data starts
Data:
name: object test 1
id: 1003
hitbox:
{
-0.0520833
-0.078125
-0.0520833
0.078125
0.0520833
0.078125
0.0520833
-0.078125
}
frames:
{
-0.0520833
-0.078125
-0.0520833
0.078125
0.0520833
0.078125
0.0520833
-0.078125
}
RGB:
{
0.392157
0.784314
0.196078
}
offset:
x: 0.104167
y: -0.3125
on ground: no
fall time: 0
direction 1
destructible: 0
transparent: 0
grounding:
 left limit: 0
 right limit: 0
blocked from above: 0
  /// print_data finishes

一切都很完美。但随后我将下一个元素添加到std::vector:

defined_terrains.push_back({args...})
defined_terrains[1].print_data();

发生这种情况:

*everything the same for object test 1*
  /// push_back starts 
COPY CSTR: object test 2
COPY CSTR: object test 1  <----- why does this happen? defined_terrains[0] was not involved here
DSTR: object test 1 <----------- its like defined_terrains[1] used defined_terrains[0] like temporary (???)
DSTR: object test 2
  /// push_back finishes 
  /// print_data starts
name: object test 2
id: 1004
hitbox:
{
-0.0520833
-0.078125
-0.0520833
0.078125
0.0520833
0.078125
0.0520833
-0.078125
}
frames:
{
-0.0520833
-0.078125
-0.0520833
0.078125
0.0520833
0.078125
0.0520833
-0.078125
}
RGB:
{
0.392157
0.784314
0.196078
}
offset:
x: -0.104167
y: -0.390625
on ground: no
fall time: 0
direction 1
destructible: 0
transparent: 0
grounding:
 left limit: 0
 right limit: 0
blocked from above: 0
  /// print_data finishes

我是愚蠢还是什么?或者push_back()是否存在严重错误?

向量正在重新分配其存储,因此它基本上是分配一个新数组,复制当前内容(因此是对对象1的复制因子的调用),在末尾存储新值,并释放旧的存储数组(因此是内容的析构函数调用)。如果您的调试打印输出显示了正在构建/销毁的对象的地址,您会看到它们位于不同的位置。