- 1 名前:デフォルトの名無しさん [2008/02/04(月) 23:32:19 ]
- あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】 回答者の便宜のため、質問の際は以下を行うことを推奨します。 ・質問は【質問テンプレ】を利用してください。 ・問題文は、出題されたまま全文を書いてください。 ・問題文やコードをリンクするときは、一言内容にについて説明をつけましょう. ・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。 ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 ・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。 ・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。 【質問テンプレ】 [1] 授業単元: [2] 問題文(含コード&リンク):() [3] 環境 [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html 【過去ログ検索】 chomework.sakura.ne.jp/ 【wiki】 www23.atwiki.jp/homework/ 【前スレ】 C/C++の宿題を片付けます 103代目 pc11.2ch.net/test/read.cgi/tech/1200318925/
- 869 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 18:03:32 ]
- >>864
int x,y; puts(" | 1 2 3 4 5 6 7 8 9\n------------------------------" for(x=1; x<10; x++) { printf("%d | ", x); for(y=1; y<10; y++) printf("%d ", x * y); }
- 870 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 18:08:44 ]
- >>869
- 871 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 20:50:16 ]
- 〉〉868
アルゴリズムの問題なのだから、bsearchを使うのはだめなんじゃないか?アルゴリズムを作って使う課題なのだろうし。
- 872 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/03/31(月) 23:11:01 ]
- 基本的に領域の開放は無理だろ swapでやるしか無いのでは?
ブロックごとに管理して100個使わなくなったら解放とかじゃないか
- 874 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:11:47 ]
- constでない操作を呼び出した時点でiteratorは無効になる。
(実装によりたまたま有効なままかもしれないけど) ↓でいいんじゃない。 while(!v.empty()) { delete v.back(); v.pop_back(); }
- 875 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/03/31(月) 23:18:15 ]
- 上のソースで、一つずつ領域解放出来るの??? swapしか出来ないと思ってたけど
- 877 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:21:33 ]
- 解放しようとしているものを取り違えている。
v.empty()がtrueだけどメモリがreserveされてる話とは別。 vector<Hoge*>().swap(v); てことだろうけど、これだとvの中のHoge*が指す先はリークする。
- 878 名前:デフォルトの名無しさん [2008/03/31(月) 23:22:22 ]
- delete v.back();
'delete' のオペランドは非 const ポインタでなければならない
- 879 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:23:14 ]
- >>878
vがconstなんだろ。それなら無理だ。
- 880 名前:デフォルトの名無しさん [2008/03/31(月) 23:23:47 ]
- >>877
後ろからサイズを小さくしていくならばresize()という関数あるけど駄目なの?
- 881 名前:デフォルトの名無しさん [2008/03/31(月) 23:24:36 ]
- vector<int> v(10000); だが・・・
- 882 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:25:26 ]
- >>880
元の質問読んでる?vector<Hoge*>の各要素が指す先をdeleteしつvectorをemptyにしたいって言ってるんだよ。
- 883 名前:デフォルトの名無しさん [2008/03/31(月) 23:31:04 ]
- そういうことね
- 884 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:39:18 ]
- >>875
3番目はboost無くても数行で実装できるよね www.google.com/search?q=for_each+delete
- 885 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:48:18 ]
- >>875
うん。今回だとdeleteを適用する関数オブジェクト作るだけだしね。
- 886 名前:デフォルトの名無しさん [2008/04/01(火) 16:21:58 ]
- [1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6189.txt [3] 環境 [3.1] OS:windowsXP [3.2] コンパイラ名とバージョン: visual studio 2003 [3.3] 言語:C言語 [4] 期限:2008年4月2日午前8時 [5] その他の制限:なし よろしくお願いします
|

|