2012-01-25 9 views
1

やろうとしている間、なぜ私はランタイムエラーを取得していますが:アサーションエラーのstdのためのstd :: 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.reserve(vi.size());'が必要ですか? – dasblinkenlight

答えて

2

予約は実際にはオブジェクトを作成しません。指定された制限までベクトルを拡大しようとするすべての呼び出しはO(1)になります。 resizeを使用してください。

+1

reserveとstd :: back_inserter(vi_1) –

+2

を使うこともできます。無駄な値を作るのを避けるため、 'reserve'を使い、' back_inserter'を使うといいと思うなら、 –

+0

'push_back'は' reserve(n) 'がなくても償却されたO(1)が保証されています。 'reserve'はベクトルが' n'よりも大きくなるまで再割り当てを保証しません。これには2つの重要な効果があります.O(1)の定数因子は実際には一定であり(償却定数ではない)、非常に小さい。イテレータ、リファレンス、または既存の要素へのポインタは無効になりません –

1

vi_1.reserve単にメモリを確保しますが、ベクトルの実際のサイズを変更しません。そのためには、resizeを使用する必要があります。

+0

確かに私は修正しました。 –

関連する問題