2013-01-22 109 views
5

當試圖生成一個隨機數的向量時,我偶然發現一個std :: bad_alloc錯誤。這裏是我的代碼:bad_alloc初始化和填充矢量?

#include "search.h" 
#include "gtest/gtest.h" 

int _size = 100; 

std::vector<int> GetSortedVector(int size){ 
    //init vector 
    std::vector<int> v(size); 
    //fill with random numbers 
    for (std::vector<int>::size_type i=0; i < v.size(); i++) 
     v.push_back(std::rand()%(2*size)); 
    //return the setup vector 
    return v; 
} 

//triggered automatically 
TEST(BinarySearch, NonUniqueSorted){ 
    std::vector<int> v = GetSortedVector(_size);//nothing moves farther than this line 
} 

P.S:我現在使用generate(),但我還是好奇爲什麼會失敗。

回答

8

v.push_back增加尺寸,所以i<v.size()從不是false

由於您的載體已經size長,你需要

for (std::vector<int>::size_type i=0; i < v.size(); i++) 
    v[i] = std::rand()%(2*size); 

填寫或使用reserve代替:

std::vector<int> v; 
v.reserve(size); 

保持push_back和核對size。我不會建議std::generate因爲你說你已經這樣做了。

+0

在預留用於循環的情況下,必須進行修改,以檢查對抗能力不大小。 – Kimi

+0

@Kimi對,忘記了。 –

+1

我不認爲檢查'容量'會是一個好主意,因爲據我所知'reserve'被允許*過度分配(即使可能實際上沒有這樣做)。而只是檢查'size'(函數參數)。 –

2

放大到以下部分:

for (std::vector<int>::size_type i=0; i < v.size(); i++) 
     v.push_back(std::rand()%(2*size)); 

每次調用push_back()時,矢量的大小增加了1。因此,i < v.size()將永遠不會計算爲false,直到你耗盡內存的循環將繼續。其中一個可能的方法來解決它是捕捉size()一次,例如:

for (std::vector<int>::size_type i=0, s = v.size(); i < s; i++) 
     v.push_back(std::rand()%(2*size)); 
+1

你應該提到你的後一個建議增加了矢量**而沒有**修改原始內容。 –

+2

我懷疑OP實際上是否需要一百個零,然後是一百個僞隨機數。 – aschepler

+0

對。問題是關於bad_alloc,而不是如何更新元素。雖然你所有的建議都是有效的:) – 2013-01-22 20:49:01