std::vector 向向量中随机添加元素

std::vector randomly adds elements to vector

我正在排序,我为排序部分编写的代码运行良好,但我有一个问题。每隔一段时间(随机时间)随机点被添加到向量的末尾,当我尝试 pop_back() 删除这些最后的元素时(因为我写了一小部分来检查以确保数字的点是相同的),我最终陷入了一个无限循环,试图删除这些最后的元素,这些元素不会消失。有什么我应该知道的吗?即使我不尝试删除它们,一些点也会随机消失。我试图了解我需要做些什么来防止这些奇怪的点突然出现,因为这些点是按特定顺序排序的。

我只有三个insert方法,第一个是emplace_back(),第二个是insert,最后一个也是insert方法:

                if (afterX >= spheres.capacity())
                    spheres.emplace_back(center);
                else if(afterX == -1)
                    spheres.insert(spheres.begin(),center);
                else
                    spheres.insert(std::next( spheres.begin(), afterX ),center);
                elementCount++;

这是我的输出,想了解一下:

Point: <5,0,0>
zFind: -1
<5,0,0>
Point: <10,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0>
Point: <100,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0><100,0,0><2.11207e-023,0,0>
Point: <30,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0><30,0,0><100,0,0>
Point: <20,0,0>
zFind: 0
yFind: 0
<5,0,0><10,0,0><20,0,0><30,0,0><100,0,0><2.10934e-023,2.21351e+033,0><0,0,2.21351e+033><0,0,0>

如您所见:点已正确添加到系列中(从最小到最大),但这些是末尾的奇数额外数字,它们存在然后消失。

谢谢, 西蒙

您正在使用 capacity 而您应该使用 sizecapacity returns 向量中 分配的 个元素的数量,可以大于向量中存储的元素数量(即 size).访问 size 末尾之后的元素是未定义的行为

当您向 size() == capacity() 所在的向量添加元素时,将分配新内存来保存整个向量(从上面显示的内容来看,您的实现在需要时将容量加倍这个)。旧内容复制到新内存,新元素加入。

额外的奇数恰好位于为新内容分配的未初始化内存中。

在正常使用 vector 的过程中,您很少需要访问 capacity