08/03/30 15:06:39
>>862
mainは適当に書いたから書き直したほうがいいかも
URLリンク(kansai2channeler.hp.infoseek.co.jp)
867:デフォルトの名無しさん
08/03/30 15:09:28
>>862
二分探索には標準ライブラリ関数bsearchを使いました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp( const void* key, const void* elm )
{
return strcmp( (const char*)key, *(const char**)elm );
}
int main(void)
{
// 規定の文字列。辞書順にソートされていること。
static const char* const table[] = {
"abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz",
};
const char** hit;
char str[101];
printf( "検索文字列:" );
scanf( "%100s", str );
hit = (const char**)bsearch( str, table, sizeof(table)/sizeof(*table), sizeof(*table), cmp );
if( hit )
printf( "'%s'は%d番目に存在します。\n", str, hit-table );
else
printf( "'%s'は存在しません。\n", str );
return 0;
}
868:867
08/03/30 15:21:42
>>863を把握していなかった。修正。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp( const void* key, const void* base )
{
const char* key_str = (const char*)key;
return strncmp( key_str, (const char*)base, strlen(key_str) );
}
int main(void)
{
static const char base[] = "aaabbc"; // 規定の文字列
const char* hit;
char str[101];
printf( "検索文字列:" );
scanf( "%100s", str );
hit = (const char*)bsearch( str, base, strlen(base), 1, cmp );
if( hit )
printf( "'%s'は%d文字目から存在します。\n", str, hit-base+1 );
else
printf( "'%s'は存在しません。\n", str );
return 0;
}
869:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/30 18:08:44
>>869
871:デフォルトの名無しさん
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] その他の制限:なし
よろしくお願いします