08/03/30 20:50:16
〉〉868
アルゴリズムの問題なのだから、bsearchを使うのはだめなんじゃないか?アルゴリズムを作って使う課題なのだろうし。
872:デフォルトの名無しさん
08/03/31 22:57:05
C++ のSTLのvectorで、要素の最後から開放していくのはこんな感じであってますか?
std::vector<Hoge*>::reverse_iterator itr = v.rbegin() ;
while( false == v.empty() )
{
delete *itr++ ;
v.pop_back() ;
}
873:デフォルトの名無しさん
08/03/31 23:11:01
基本的に領域の開放は無理だろ swapでやるしか無いのでは?
ブロックごとに管理して100個使わなくなったら解放とかじゃないか
874:デフォルトの名無しさん
08/03/31 23:11:47
constでない操作を呼び出した時点でiteratorは無効になる。
(実装によりたまたま有効なままかもしれないけど)
↓でいいんじゃない。
while(!v.empty()) {
delete v.back();
v.pop_back();
}
875:デフォルトの名無しさん
08/03/31 23:14:51
pop_backした際にiteratorが無効になるので駄目。
なので
while( ! v.empty() ){
delete v.back();
v.pop_back();
}
もしくは
for(std::vector<Hoge*>::reverse_iterator itr = v.rbegin();itr != v.rend();++itr)
delete *itr;
v.clear();
もしくは
std::for_each(v.rbegin(),v.rend(),boost::checkd_deleter<Hoge>());
v.clear();
あたりをどうぞ。
2番目か3番目がお勧め(3は要boost)
876:デフォルトの名無しさん
08/03/31 23:18:15
上のソースで、一つずつ領域解放出来るの??? swapしか出来ないと思ってたけど
877:デフォルトの名無しさん
08/03/31 23:21:33
解放しようとしているものを取り違えている。
v.empty()がtrueだけどメモリがreserveされてる話とは別。
vector<Hoge*>().swap(v);
てことだろうけど、これだとvの中のHoge*が指す先はリークする。
878:デフォルトの名無しさん
08/03/31 23:22:22
delete v.back();
'delete' のオペランドは非 const ポインタでなければならない
879:デフォルトの名無しさん
08/03/31 23:23:14
>>878
vがconstなんだろ。それなら無理だ。
880:デフォルトの名無しさん
08/03/31 23:23:47
>>877
後ろからサイズを小さくしていくならばresize()という関数あるけど駄目なの?
881:デフォルトの名無しさん
08/03/31 23:24:36
vector<int> v(10000); だが・・・
882:デフォルトの名無しさん
08/03/31 23:25:26
>>880
元の質問読んでる?vector<Hoge*>の各要素が指す先をdeleteしつvectorをemptyにしたいって言ってるんだよ。
883:デフォルトの名無しさん
08/03/31 23:31:04
そういうことね
884:デフォルトの名無しさん
08/03/31 23:39:18
>>875
3番目はboost無くても数行で実装できるよね
URLリンク(www.google.com)
885:デフォルトの名無しさん
08/03/31 23:48:18
>>875
うん。今回だとdeleteを適用する関数オブジェクト作るだけだしね。
886:デフォルトの名無しさん
08/04/01 16:21:58
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS:windowsXP
[3.2] コンパイラ名とバージョン: visual studio 2003
[3.3] 言語:C言語
[4] 期限:2008年4月2日午前8時
[5] その他の制限:なし
よろしくお願いします