C/C++の宿題を片付けます 104代目at TECH
C/C++の宿題を片付けます 104代目 - 暇つぶし2ch866:デフォルトの名無しさん
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] その他の制限:なし

よろしくお願いします


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch