2016-01-02 92 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