[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/13 10:33 / Filesize : 185 KB / Number-of Response : 779
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part66



1 名前:デフォルトの名無しさん [2009/01/11(日) 11:21:38 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part65
pc11.2ch.net/test/read.cgi/tech/1230341243/

208 名前:デフォルトの名無しさん [2009/03/27(金) 21:09:51 ]
C++の副作用に関して良く解らないので教えてください。

int a=0;
int b=0;
int func(int c){ b=a; return c; }

このとき、
func(++a);

を通ると、bに1が入ることは保障されますよね?

func(a++);

この場合はどうでしょうか?
bに0が入る?
bに1が入る?
鼻から悪魔?


209 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:16:01 ]
>>208
関数を呼ぶ直前と、関数から戻った直後に副作用完了点がある。
だから、どちらもbは1になる。

210 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:22:54 ]
>>209
有難うございます。


211 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:28:25 ]
>209
すいません。もうひとつ教えてください。

&& || ?: , 以外の演算子は副作用完了点ではないんですよね?
自分でオーバーロードした演算子の場合は
通常の関数と同じように関数に入る直前と戻った直後に副作用完了点はありますか?


212 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:32:31 ]
>>211
ある。

ただし、最初にあげてる演算子をオーバーロードした場合、
組み込み演算子と違って、オペランドの評価順序が不定になったり、
ショートサーキットでなくなったりするのには注意。

213 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:42:28 ]
有難うございます。

たびたびすみません。
「オペランドの評価順序が不定になる」とは何ですか?
組み込み演算子でも一般的に不定だと思うのですが、
オーバーロードによって不定でなかったものが不定になる場合があるのですか?


214 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:53:18 ]
あ、
組み込みの && || ?: , 演算子の評価順序のことですね?
自己解決しました。


215 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:22:27 ]
printfで64bit値(u_int64_t)を表示したい。
32bit環境では %llu
64bit環境では %lu
両対応でスマートな解決法ってないものだろうか?

define拾ってきて切り替えるくらいしか思いつかない


216 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:32:40 ]
unsigned long long にキャストしていつでも %llu で表示する




217 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:35:15 ]
VCとかは%I64uだったような
defineで切り替えるしかないんじゃね?

218 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:21:24 ]
末尾にLがついてるのってlong int だよな?

219 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:25:57 ]
>>216
その手があったか!
思考がループしてそこまで考え付かなかった。 thx


220 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 01:23:02 ]
C99かC++0xでは<inttypes.h>のPRIu64を使う

221 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:28:24 ]
>>220
それだと、uint64_t使えというところから始めないと。

222 名前:193 mailto:sage [2009/03/28(土) 19:54:02 ]
>>194
あまりにもな遅レスすまんかった!!
ちょっと私用が。。。

汎整数昇格 了解しました。
ありがとう。

223 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:31:56 ]
最近C++の勉強をはじめた者なんですが、n個のデータを打ち込んで
それらの平均値や標準偏差を求めるプログラムを打ち込んだところ、

.\例題2.1.cpp(10) : error C2679: 二項演算子 '>>' : 型 'const char [2]' の
右オペランドを扱う演算子が見つかりません (または変換できません)。

というエラーが出てしまったんですが、なにが原因かさっぱりわかりません。
いつもと同じように打ち込んだつもりなのですが、原因分かる方いませんか?

224 名前:デフォルトの名無しさん [2009/03/28(土) 23:33:21 ]
せめて例題2.1.cppの10行目くらい見せろよ

225 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:43:10 ]
cout<<"nの値は?"; cin>>n>>"\n";

こうなっています。見たところどこにもミスはないと思うのですが・・・

226 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:45:32 ]
>>225 cout<<"nの値は?"; cin>>n;




227 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:47:54 ]
>>225
場合によって意味が変わるけど<<は出力、>>は入力
cin >>n
nに入力された値を入力
n>>"\n";
次に入力された値を"\n"に入力
だぞ?

おかしいだろ

228 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:50:52 ]
>>226
ああ、なるほど!入力と出力の指令が混同してましたね(汗)
こりゃ動かんわ・・・どうもありがとうございました!!

229 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:00:58 ]
以下のようなコードを見たのですが、
これってC++のルール上、
((T*)NULL)->function() は安全にコールできるんでしょうか?

class T {
 void function(){
  if (this == NULL){
 return;
  }
  メンバにアクセス
 }
}

function() が virtual だとしたらヌルポ例外ですよね?


230 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:06:01 ]
>>299
C++にnull_pointer_exceptionなんて気の利いたもんはない。多分OSがそのプロセスを殺そうとするだけだろう。

経験則ではメンバに触れなければ落ちないけど規格で決まってる訳ではないだろうからお勧めしない。

231 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:07:05 ]
誰もいないところにパスした。
>>230>>229

232 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:13:00 ]
>>229
((T*)NULL)-> が現れた時点で未定義動作になる。関数の中身は関係ない。

233 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:20:21 ]
>>230 >>232
ありがとうございます。


234 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:41:21 ]
((T*)NULL)->function()
このfunction()をstatic関数にしてみるとどうだろう?
有識者のご意見を聞きたい。

class T
{
public:
static void function(){}
};

int main()
{
((T*)NULL)->function();
return 0;
}


235 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:43:43 ]
未定義。だいたいコンパイル通るのか

236 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:46:42 ]
通るよ



237 名前:234 mailto:sage [2009/03/29(日) 00:49:17 ]
ちゃんと質問する前にコンパイル済み。
通ったよ。g++ね。


C++では
(T*)NULL
自体は未定義じゃないよね?
>>232さんが言っているように
>((T*)NULL)-> が現れた時点で未定義動作になる。関数の中身は関係ない。
なのだとしたらstaticだろうが何だろうが確かに未定義になるのだろう。
が、static関数なら実質的にグローバル関数扱いなのではと思っているので疑問だった。
staticなメンバ関数はstaticなメンバ変数にしか触れることができないじゃん。


>>236
チェックしてくれてありがとう。

238 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:54:50 ]
c++でcキャストは使うべきじゃないよ。 >229

239 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:55:55 ]
今更そこに突っ込む不毛さ。

240 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:01:01 ]
class Test
{
public:
void func( void ){ std::cout << "test"; }
};

int main( void )
{
static_cast<Test*>(NULL)->func();
return 0;
}

メンバ変数に触れなければこれもコンパイル通って動きそうだけど
さすがに未定義か?

241 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:04:39 ]
>>240
括弧が足りなくないか?


242 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:06:19 ]
ほぼ全ての環境で動くだろうけど未定義。

メンバ関数の呼び出しはつまるところ暗黙の引数thisを含む関数の呼び出しにすぎない。それがNULLであったとしても関数を実行するコードはあるので実行はされる。

でも未定義。

243 名前:237 mailto:sage [2009/03/29(日) 01:07:21 ]
>>240
メンバ関数に触れていても通るよ。
コンパイラにはNULLかどうかなんてコンパイル時に分からない。
全く問題無く通り、実行時に鼻から悪魔が出て来ることとなる。


244 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:09:10 ]
ところが
>>237
が言っているstatic関数になると話は別じゃね?
俺はstatic関数に詳しいとかいうわけじゃないから知らんけど、
グローバル関数に無理矢理クラス内というスコープつけたものという認識。


245 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:21:49 ]
>>244
未定義動作になるのは、オブジェクトを指していない参照に対して単項 & や sizeof など特殊な
ものを除く演算子を適用した場合はいつでも。

アロー演算子 -> の右にあるのが何だとか関数が static だとかそんなのは関係ない。

246 名前:244 mailto:sage [2009/03/29(日) 01:27:35 ]
>>245
へーそうなんだ、ありがと。



247 名前:237 mailto:sage [2009/03/29(日) 01:33:32 ]
delete NULL;
ってのがあったな。めずらしく安全な例で。

248 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:41:17 ]
>245
ポインタだからいいんじゃね?

4.10 Pointer conversions
(snip)
A null pointer constant can be converted to a pointer type;
the result is the null pointer value of that type and is distinguishable
from every other value of pointer to object or pointer to function type.


249 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:43:30 ]
>>248
p->x は (*p).x と定義されている。

250 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:47:04 ]
キャスト演算子だけなら問題ないってことだろ。
((T*)NULL);

251 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:09:54 ]
std::vector<ポインタ型> v;
というのがあって

あるタイミングで
v.push_back(アドレス);

これやるとmemoty.stlの__rw_basis::data()で落ちるんです。どうやらタイミングとかが関係するみたいなんで
どなたかエスパーお願いできないでしょうか?再現ができなくて申し訳ないんですが・・・

252 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:13:33 ]
>>251
スレ違いです。↓へどうぞ。
pc12.2ch.net/test/read.cgi/tech/1187922645/

253 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:16:08 ]
環境書いてよ。それだけだとRogueWave製の標準ライブラリを使ってることぐらいしか分からない。

254 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:16:48 ]
>>250
それはあたりまえ。だれもそんなところ問題にしていない。

255 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 10:59:55 ]
__LINE__みたいに関数名表示するマクロありませんか?

256 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 11:02:31 ]
標準ではC99で__func__。
コンパイラ拡張なら色々。



257 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 11:34:03 ]
ちなみにマクロじゃないぜ。

258 名前:デフォルトの名無しさん [2009/03/29(日) 17:40:26 ]
戻り値が指定されてる関数で、
関数の最後にreturnが無くても
関数の最後まで到達しないなら
C++の規格上は正しくコンパイル、実行できることは保障されますか?

たとえば以下のような記述は問題ないですか?

int a(int n){
 if (n){
  return 0;
 }
 else {
  return 1;
 }
}

int b(int n){
 if (n*n>=0){
  return 0;
 }
}

int c(int n){
 while(1);
}

259 名前:デフォルトの名無しさん [2009/03/29(日) 17:45:52 ]
全部問題あります。

260 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 17:48:43 ]
>>258
b()とc()は警告出るだろ

261 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 18:46:39 ]
>>258
戻り値が指定されてる関数で、
関数の最後にreturnが無くても
関数の最後まで到達しないなら
C++の規格上は正しくコンパイル、実行できることは保障される。

ただ、b() はその条件を満たしていない。

262 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 19:44:12 ]
nの値により条件を満たすのでは?

263 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 19:49:06 ]
値によらないだろw

264 名前:デフォルトの名無しさん [2009/03/29(日) 19:56:38 ]
仮に
int b(int n){
 if (n*n>=0){
  return 0;
 }
 assert(false);
 return 1;
}
と書いても鼻から悪魔が出るだけだな

# スレ違いっぽいが

265 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:15:29 ]
俺は、例えばn=1000000って意味に取った

266 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:26:00 ]
ああ二乗してるから必ず正なわけか



267 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:27:06 ]
でもオーバーフローした時に悪魔だな

268 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:07:55 ]
aもbもcも書いたとおりにコンパイルも動作もできるし
と思っているのだが,bはNGなのか?

269 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:12:18 ]
bを実行したとき、nの二乗がintをoverflowしたときは鼻から悪魔が出る
それ以外はコンパイルも動作もOK

270 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:04:54 ]
int b(int32_t n) {if (int64_t(n) * n >= 0) return 0;}
なら大丈夫かな?

271 名前:デフォルトの名無しさん [2009/03/30(月) 12:38:17 ]
大丈夫も大丈夫じゃないも、問題が起きそうな記述に警告を出してくれない方がよほど大丈夫じゃない

272 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 12:50:14 ]
本当に簡単に鼻から悪魔るんだな
もうsqrt(abs(n)) <= INT_MAXとかoptionalとか使って部分関数として定義するしかないのか

273 名前:デフォルトの名無しさん [2009/03/30(月) 20:07:59 ]
コンマ演算子は副作用完了点で、
関数の引数のコンマは副作用完了点ではないのは理解してますが、
初期化子のコンマは副作用完了点でしょうか?

たとえば、以下のコードは正しく動きますか?

struct T {
 int a,b;
 ......
};
int f();

void g(){
 T t={ f(), t.a };
 .......
}

void h(){
 int a[2] = { f(), a[0] };
 .......
}

274 名前:デフォルトの名無しさん [2009/03/30(月) 20:27:52 ]
あと、同じ型で複数の変数を定義する時のコンマは副作用完了点でしょうか?

たとえば、以下のコードは正しく動きますか?

void g(){
 int a=f(),b=a;
 ......
}

275 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:21:29 ]
継承した親クラスの実体を参照するメンバ変数を、なるべく無駄なメモリを消費せずに
実現したいのですが、よい方法はないでしょうか?
メンバ関数を使えばよいのは承知しているのですが、できれば "()" を書かずに済ませたいのです
struct coord { int x; int y; } ///< これを親にしたい
class state {
coord position; ///< この部分をメンバ変数として持つのではなく親から継承したい
coord velocity;
void foo();
}
extern void bar(coord& param);
void state::foo() { bar(position); bar(velocity); }

現在は親の参照を返すメソッドを作り、マクロでごまかして無理矢理実現しています
しかしマクロがソース全域に作用してしまうのでなんとかしたいのです
class state: public coord {
coord velocity;
coord& position() { return *this; } ///< 参照を追加
const coord& position() const { return *this; } ///< const 参照を追加
#define position position() ///< 強引にマクロ…関係ない部分まで作用してしまうのが難点
void foo(); ///< foo() 内で親の実体を *this ではなく position と書いてアクセスしたい!
}

試しにこんな風に書いてみたのですが、うまくいきませんでした
class state: public coord {
coord velocity;
const coord& position; /// こんな感じの参照をメモリ消費なしで定義したい
state(): position(*this) {} /// ここでエラー orz
void foo();
}

276 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:02:24 ]
>>275
何かいろいろとアレな気がするが、少なくとも私の環境では

struct coord { int x; int y; };

class state: public coord {
coord velocity;
const coord& position;
state(): position(*this) {}
void foo();
};

というコードはコンパイルが通る。

エラーが出るというなら、コンパイラの名前とエラーメッセージを書いてほしい。
あと、クラス定義の最後のセミコロンを忘れていないかね?



277 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:11:06 ]
セミコロンを忘れてしまい申し訳ないです。
コンパイラはVC++6.0 SP5+プロセッサパックでエラーメッセージは以下の通りです

error C2758: 'position' : オブジェクト コンストラクタの初期化リストで初期化されませんでした。
'position' の宣言を確認してください。

最近のコンパイラではこのソースでも動くとのことなので、こちらでもコンパイラを変えて
試してみようと思います。

278 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:12:07 ]
>>275
なんか、やりたい動機がよくわからんのだが・・・。
stateからxは、継承関係にあるから当然そのまま参照できるよね。
void foo() { x = 1; }
親クラスのメンバであることが明示されたコードを書きたいってこと?
それなら
void foo() { coord::x = 1; }
これでいいと思うんだけど。

279 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:13:40 ]
何度も書き込んで申し訳ありません、VC6でもコンパイルできました
warning C4355: 'this' : ベース メンバ初期化リストで使用されました。
エラーではなくワーニングが出ていたのが原因でした。お騒がせしました

280 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:15:01 ]
>>278
foo()内部で bar(*this); ではなく bar(position) と書きたい、というのが動機です

281 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:25:21 ]
>>280
あー、何となく気持ちはわかる。でも俺がやるとしたら
#define This (*this)
的な方法を選ぶかなぁ、実際にはやらないだろうけどww

282 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:17:31 ]
ありがとうございます。説明不足で申し訳ないです。動機はもっと正確に書くと、
クラス同士が親子関係を持っていなかった時点と同じ可読性(できれば完全に同一の記述)を
クラス間に親子関係を持たせた後も維持したい、です

1. foo() 内部で bar((coord&)*this) や bar(position()) と書かずに以前のまま bar(position) と書きたい
2. foo()の外部で
 state a;
 coord b;
 a = b;
 a.position = b;
 上記のように書いた場合に両者のコンストラクタを区別したい
 区別のために ((coord&)a) = b と書きたくない
3. 親を参照するメンバ変数 position& が最適化後に実体を持たずに消えてほしい (調べてみたところ、VC6では消えませんでした)

マクロを使うことで制限つきながら上記3つは実現できたのですが
マクロの範囲が広すぎて関係ない部分まで影響が出るのが難点でした

要はほとんど好みの問題なのですが、どんな泥臭い方法でもいいので、
A. 無駄なメモリを消費しない自分自身(親の実体)への参照を定義するか、
B. プリプロセッサに頼らずにメンバ変数の記述でメンバ関数の呼び出しが行われるようにしたいのです

もしBが可能なのであれば、例えばコンストラクタがあってunion化できないメンバ変数へ
部分的なアクセスを行う擬似unionのようなことも(C++の理念的にどうなのかは別として)できそうです

283 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:20:18 ]
マクロは全力で避けろ
継承は is a の関係
包含の方が多くの場合適切
なぜ男なんだ

284 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:41:45 ]
>>282
なんか、説明聞いたらさらにツッコミたくなってしまったw
foo() の汎用性を持たせたいなら static foo(coord&) にして
メンバの場合
foo(*this);
変数の場合
coord c;
foo(c);
と俺はしたくなる。
ちなみに、bar((coord&)*this) は冗長なキャストだけど、わざとそう書いたんだよね・・・?

285 名前:デフォルトの名無しさん [2009/03/31(火) 02:45:50 ]
すみませんが、
>>273 >>274 お願いします。

286 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 02:58:04 ]
>>285
少なくともVC++8で試してみたらコンパイルは通って動作も期待通りだった。
C++の言語仕様として保証されているものかどうかは知らん。



287 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 03:44:39 ]
>>273
挙げられた例では未初期化のオブジェクトを参照しているので、
副作用完了点に関わらず、値が不定となる。つまり int i = i; と同じ。


ちなみに、初期化子および初期化宣言を区切るカンマではそれぞれで
「完全式」が区切られるので、副作用完了点となる。

ただし並べられたそれらの順番について C++ 2003 では規格に記述がなかったので、
次期改定で記述順に評価されることが決まる予定。
www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#430

なお、同じく次期改定で追加される initializer list については、・・・アレ、
評価順についての記述が見当たらない。大丈夫なんだろうか?

288 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 06:18:52 ]
C++かCでデータ構造関係のアルゴリズムが詳細に
掲載されている本というとどんなのがありますかね?


289 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 21:09:06 ]
>>287
ありがとうございます。
リンク先は非常に参考になりました。

すみませんが、依然 >>274 がわかりません。
おわかりでないでしょうか?

> 挙げられた例では未初期化のオブジェクトを参照しているので、
これに >>274 も含まれていたりしますか?

英語版wikipediaでは、
> At the end of an initializer; for example, after the evaluation of 5 in the declaration int a = 5;.
とありますが、
an initializer がどういう単位か分かりません。

MSDNでは、
> The end of a full initialization expression, such as the end of an initialization in a declaration statement.
とありますが、a full initialization expression が、
int a=5, b=a*10, *c=&a, &d=a;
のa,b,c,d それぞれなのか、この文全体なのかわかりません。

よろしくお願いします。


290 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 21:32:20 ]
std::stack<std::string> s;
とした場合、
s.push(〜)はsの中に〜のコピーが出来る仕様でしょうか?

つまり
std::stack<std::string> s;
std::string *p=new std::string;
s.push(*p);
delete p;
としたとしても、スタックsは何の影響もなくs.top()とかしていいんでしょうか?


291 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 21:44:03 ]
多分だめじゃよ、とーまんこー。
コンテナは値セマンティクスを要求するから
値として振舞わないものは入れられないのじゃ。
入れるならしぇあぽを入れなされ。

そして、そのプログラムは「依頼人のいない弁護士」を
保持することになる。

292 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 21:46:58 ]
>>290
stackにpushした時点でstringがstack内にコピーされるから問題ない。


293 名前:191 mailto:sage [2009/03/31(火) 21:57:27 ]
あぁ、ほんとだpushの引数に * が付いてた^^
すまんこ学園。つまり>>292が正解。

294 名前:290 mailto:sage [2009/03/31(火) 22:19:18 ]
>>291-293
なるほど。
ありがとうございました。
これで安心して組めます。

295 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 22:30:08 ]
すまんこ・・・

296 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 23:45:05 ]
トライ木ってどんな木なのでしょうか?
データ構造がいまいちわかりません



297 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 00:09:25 ]
>>296
ttp://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%82%A4%E6%9C%A8

298 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 00:12:16 ]
たとえばABC,ADE,ABDの三要素のトライ木を書くとこんなかんじ
A-B-C
| |-D
|
|-D-E

左端のAが木のトップで右側が子要素な。
親から末端ノードまでの要素を連結すると登録した要素になる。

ツリーの深さはキー長に比例するけど1回辺りの比較が超軽いのが特徴。

これを改良したのにパトリシア木とかあるけど詳細は略

299 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 00:23:02 ]
>>298
データ構造をどう表現していいの?

ノード毎にオブジェクト作るとかアホな
データ構造しか作れそうにないんだけど
意味あるのですかね?

300 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 00:42:58 ]
N木使えばいいやん

301 名前:デフォルトの名無しさん [2009/04/01(水) 00:47:31 ]
ノード毎にオブジェクト作っていいんじゃないの。

302 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 01:19:15 ]
そういや昔
map<string, map<string, map<string, map<string, string> > > >
みたいなの扱ったことあったなぁ、デバッグしててわけわかんなくなったりしたけどw
これもトライ木と言え・・・ないか。

303 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 01:21:12 ]
>>302
発狂しそうだw

304 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 02:59:01 ]
>>299
利点としては多数のキーが格納されてるときに、
一般的な二分木と比べてキーの探索が速いのと、メモリの無駄が少ない事

ただ、キーが文字列みたいに分解可能であることを要求するから
データの制約は2分木よりあるからトライ木って結構使いどころを選ぶんだよなー

305 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 03:10:28 ]
トライと聞いてスクールウォーズを思い出した。

306 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 04:12:12 ]
>>289
int a = 5;
↑この宣言において、 "initializer" (初期化子)は "= 5" の部分。

あとはわかるよね?

MSDN の "full initialization expression" は規格中に現れる用語では
ないのではっきりしないけど、おそらく上記の宣言における 5 に対応するもの
だろうと考えられる。



307 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 04:15:18 ]
>>289
英語が読めるんなら規格のドラフトを読んだほうがいいかもね。

ただし「シーケンスポイント」というものは次期規格からはなくなってしまうようだ。
スレッド関連を規格化するための影響みたい。
"A finer-grained alternative to sequence points"
www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html

308 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 08:10:13 ]
>>306
わかりました。
有難うございます。

>>307
規格書は結構高かった気がするので....
そのうち手に入れます。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<185KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef