2016-01-02 57 views
1

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

我只有三个插入方法和第一种是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> 

正如你可以看到这一点:一点是在一系列正确添加(最小到最大),但这些都是在年底奇怪的额外的数字是有,然后消失。

感谢, 西蒙

+3

最有可能的是,插入和从元素中删除元素会使所有现有的迭代器失效。但是如果没有看到代码,就很难给出真正的答案。 –

+0

只需推回元素并进行排序。简化您的代码。 –

回答

3

您使用capacity,你应该使用sizecapacity返回向量中分配元素的数量10,该元素可以大于向量中存储的元素数(它是size)。在size末尾访问元素是未定义的行为

当您将一个元素添加到一个向量中,其中size() == capacity(),将分配新的内存来保存整个向量(根据您上面显示的内容,您的实现将容量加倍何时需要这样做)。旧内容被复制到新内存中,并添加新元素。

奇数的额外数字就是刚刚分配给新内容的未初始化内存中所发生的情况。

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

+0

谢谢!这有助于! – simonfrfr