2012-01-25 108 views
1

斷言錯誤:: vector的

std::vector<int> vi; 
std::generate_n(std::back_inserter(vi),10,rand); 

std::vector<int> vi_1; 
vi_1.reserve(vi.size()); 
std::copy_if(vi.begin(),vi.end(),vi_1.begin(),std::bind2nd(std::greater<int>(),-20000)); 
//Here (in copy_if) I'm getting assert error. 
+0

錯誤消息說什麼? – blubb

+1

你確定你需要'vi_1.reserve(vi.size());'而不是'vi_1.resize(vi.size());'? – dasblinkenlight

回答

2

儲備實際上並沒有創建對象,它只是保證說,每當那將向量增長到給定限制通話將是O(1)。使用resize

+1

您還可以使用儲備和std :: back_inserter(vi_1) –

+2

如果覺得我寧願保持'reserve'並使用'back_inserter',以避免產生無用的值。 –

+0

'push_back'有保證的O(1),即使沒有'reserve(n)'。 'reserve'保證不會重新分配,直到vector變得大於'n'。這有兩個重要的影響:O(1)中的常數因子確實是常數(不僅是一個攤銷常數),而且非常小;並且沒有迭代器,對已經存在的元素的引用或指針將失效 –

1

vi_1.reserve僅僅保留的內存,但不改變載體的實際大小。爲此,您必須使用resize

+0

確實,我做了,更正了。 –