2012-01-25 1 views
1

Почему я получаю сообщение об ошибке выполнения при попытке сделать:ошибка Assertion при использовании зОго :: copy_if для станда :: вектор

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

Если вы думаете, что я предпочитаю хранить «резерв» и использовать «back_inserter», чтобы избежать создания бесполезных значений. –

+0

'push_back' гарантируется амортизацией O (1), даже без' reserve (n) '. 'reserve' не гарантирует перераспределения до тех пор, пока вектор не станет больше, чем' n'. Это имеет два важных эффекта: постоянный коэффициент в O (1) действительно постоянный (не только амортизированная постоянная) и очень малый; и никакие итераторы, ссылки или указатели на уже существующие элементы не будут признаны недействительными –

1

vi_1.reserve просто резервирует память, но не изменяет фактический размера вектора. Для этого вам нужно использовать resize.

+0

Действительно, я сделал, исправил. –