std::vector push_back()擦除上一个元素
std::vector push_back() erases previous element
我有一个类"地形"(每一个特殊函数都被定义了——我很绝望)
所以,当我一个接一个地定义对象时,一切都很好,但当涉及到多个对象时,它是无效的。所以我做了一个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的复制因子的调用),在末尾存储新值,并释放旧的存储数组(因此是内容的析构函数调用)。如果您的调试打印输出显示了正在构建/销毁的对象的地址,您会看到它们位于不同的位置。
相关文章:
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么在功能内擦除元素后不列出更新?
- 在任一方向上迭代容器并擦除元素
- 从向量和对向量中擦除元素的差异
- 从地图上擦除元素,然后将其放回原处
- 迭代一组和擦除元素
- 使用常量键从集合中擦除元素
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 如何更有效地从向量或集合中擦除元素?
- 在尝试擦除元素之前,我们是否需要检查unordered_set是否包含元素
- 从矢量中最快的擦除元素或更好地利用内存(排序基数)
- 迭代地图和擦除元素
- 迭代时从 STL 容器中查找并擦除元素
- 在 c++ 中从列表中擦除元素时出现问题
- C++嵌套的带有擦除元素的循环
- 矢量2D擦除元素并保持字段为空
- 比较第一个向量的不同矢量迭代器和擦除元素
- 从多维矢量中擦除元素
- 根据属性值在结构向量中擦除元素
- 从hash_map内的列表中擦除元素