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

时间:2016-01-02 03:55:48

标签: c++ random vector std c++14

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

我只有三个插入方法,第一个是emplace_back(),下一个是插入,最后一个也是插入方法:

                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>

正如你可以看到的那样:点在系列中正确添加(从最小到最大),但这些是最后的奇数额外数字然后消失。

谢谢, 西蒙

1 个答案:

答案 0 :(得分:3)

您正在使用capacity,您应该使用sizecapacity返回向量中已分配的元素的数量,这些元素可能大于向量中存储的元素数量(size)。访问size末尾之后的元素是未定义的行为

当你将一个元素添加到size() == capacity()的向量时,将分配新的内存来保存整个向量(从你上面显示的内容开始,你的实现在需要时将容量加倍) 。旧内容将复制到新内存中,并添加新元素。

奇怪的额外数字恰好是坐在为新内容分配的未初始化内存中的内容。

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

相关问题