1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
357 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 16:44:37 ] VC++環境です。STLのlistについて質問です。 あるlist(Aとする)の情報をまるまる別のlist(Bとする)にassign()で写したのち、 Aのある位置を指しているイテレータをそのままBで使いたい (Aで指していた位置にある情報を指させたい) のですが、方法を探しても見つかりません。 アルゴリズムのfind()以外で何か方法はありますか?
358 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:13:09 ] >>357 std::distance(), std::advance() ただ、listだとランダムアクセス出来ないから 一応それぞれO(n)で、セットでO(2n)になる。 まぁとんでもない要素数でない限り一瞬だろうけど。
359 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:18:01 ] listはアクセスするだけでもメモリの中を不規則な順序で飛び飛びするので、平均の次の要素へのアクセス速度は 要素が連続しているvectorよりも遅い。
360 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:24:45 ] >>357->>359 頭からの距離で考える発想は思いつきませんでした。 要素も少なく、実際に動かしてみても一瞬で処理できました。 ありがとうございました。
361 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 22:12:24 ] 解決したようだが、 begin()〜itとit〜end()の2回に分けてコピーするのもいいな。
362 名前:355 mailto:sage [2008/06/24(火) 02:37:33 ] ffmpegをヤフりました. MS-DOSで動くオープンソースの動画変換アプリなんですね. ソースを見て参照方法を探れということですね? これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか? それと商用配布は考えていないのでライセンス申請の必要はありません.
363 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 03:12:10 ] いいえ、商用に限らず許可なく使うことは許されません。
364 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 07:35:29 ] 特許権は、それを使ったものを製造、保管、流通することを制限することができるよ。 商用かどうかは関係ないよ。 詳しくは法務に聞こうね。
365 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 10:47:36 ] >>362 > MS-DOSで動くオープンソースの動画変換アプリなんですね. 違います。 > ソースを見て参照方法を探れということですね? 違います。 > これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか? 規格書読むより時間掛かりませんよ。
366 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:10:28 ] classのstaticメンバで、shortの配列があります。 例えば、 class hoge { private: static array[100]; }; となっていて、arrayの中身を for(int i=0; i<100; i++){ array[i] = i*i; } のように初期化したいとします。 このよな作業はどの箇所で行えばいいでしょうか。
367 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:16:38 ] >>366 クラスの外で一回やっておけばよい。 main()が呼ばれる前に初期化される保証がある。
368 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:19:15 ] Singletonの問題のようにも思えるが
369 名前:366 mailto:sage [2008/06/24(火) 16:27:24 ] >>367 GCCですが、.cxxの先頭でやると怒られます。 src/hoge.cxx:24: error: expected unqualified-id before ‘for’ src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘<’ token src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘++’ token 24: for(int i = 0; i < 100; i++){
370 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:28:58 ] #include <iostream> class hoge { private: static int array[100]; static int flag; public: hoge() { if (flag) { for (int i = 0; i < 100; i++) array[i] = i * i; flag = 0; } } void printa() const { for (int i = 0; i < 100; i++) std::cout << array[i] << ' '; } }; int hoge::flag = 1; int hoge::array[100]; int main() { hoge h; h.printa(); }
371 名前:366 mailto:sage [2008/06/24(火) 16:31:18 ] short* hoge::array = 0; としておいて、constructorで if(!array){ array = new short[100]; for(int i=0; i<100; i++){ array[i] = i*i; } } でしょうか。それだと、いつdeleteするのでしょうか。 それとも、初期化フラグをメンバ変数に持っておいて、 それのtrue/falseでconstructorからfor文を呼び出す?
372 名前:366 mailto:sage [2008/06/24(火) 16:32:03 ] >>370 ということのようですね。 ありがとうございました。
373 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:22:54 ] どんな初期化をするかにも夜 コンストラクタとデストラクタは忘れないであげてくだちぃ
374 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:54:53 ] >>373 staticだからこの場合は無理なのよ
375 名前:355 mailto:sage [2008/06/24(火) 18:33:23 ] ffmpegのAPIを使ってMPEG2を読み込めということでしょうか? 現在mpeg2dec-0.4.1 とでどちらを使うか考えています. 両方の向き不向きについて何か教えてくれませんか?
376 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:49:21 ] C++相談室
377 名前:355 mailto:sage [2008/06/24(火) 19:53:12 ] すみません. そうでした.完全にスレ違いになってしまいました. 去ります
378 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:49:33 ] C++って先頭からコンパイルしますよね だから↓はコンパイルエラーになりますよね。 void main(){ int a=func(3); } int func(int x){ return x+5; } なのに、なぜ↓はコンパイルエラーにならないんでしょうか? class cA{ public: cA(){a=10;} private: int a; };
379 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:50:14 ] C++って、単純な速さは他の言語と比較してどうなの?
380 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:56:45 ] >>378 そういう仕様に決まったから。 >>379 書き方や問題領域で当然変わってくるけど、大体Cと同じ。
381 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:58:44 ] ていうことは、C++のコンパイラは場合によっては、 読む場所を行ったり来たりしうるんですね ありがとうございました
382 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:00:09 ] >>378 正確に述べると、クラス定義の中に関数定義を書くと、 そいつはクラス定義の終わった後に、inline付で定義されたものとして扱われるということになる。
383 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:15:49 ] クラス宣言じゃないのか。
384 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:37:29 ] 定義。
385 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:51:00 ] クラス宣言って外部でメンバ関数の定義をしたりあと前方宣言 の時に使われる物?
386 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 08:26:28 ] クラスそのものを後方定義というやり方にも使う。
387 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 09:26:57 ] template<typename T> struct base{ typename T::X test(){ return typename T::X(); } }; struct A : base<A>{ struct X{} }; 継承するクラスのテンプレートに継承するクラス自身を渡して、 継承するクラス内の型を基底型で使いたいのですが不可能でしょうか?
388 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 10:55:21 ] >>387 全く問題ない。
389 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 11:27:40 ] >>387 弾かれました template<typename T> struct base{ typename T::X test(){ return typename T::X(); } <-error C2039: 'X' : 'A' のメンバではありません。 }; struct A : base<A>{ struct X{} };
390 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 13:48:24 ] struct X {}; struct A { void add( X* x ); }; X* x = new X; A a; a.add( x ); A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。 この場合 A::add() が失敗して例外を投げるとき A::add() は x を delete するべきでしょうか? 普通、関数が例外を投げるときその関数が何もしなかったことにするのが理想だと思いますが delete したほうが便利な場合も多いと思うのですが。
391 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 14:02:32 ] すべきでないと思う auto_ptrを使えばどうか struct A{ void add(std::auto_ptr<X> x); }; std::auto_ptr<X> x(new X); A a; a.add(x);
392 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:30:13 ] >>390 391に同意。 a.add(x)に渡すxはnewしないといけないという変な制約が発生してしまうから。
393 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:45:33 ] boost の shared_ptr のコンストラクタや ptr_container の追加関数は 確か失敗したら delete される設計になってた。
394 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 02:56:30 ] >>390 そのインターフェースなら a.add(new X) したくなりそうだから、 delete したほうがいいと思う。
395 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:01:08 ] >>393 スマートポインタと一緒にしちゃだめでしょ。 >>394 X x; a.add(&x)で落ちてもいいんだね。
396 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:08:30 ] >>395 boost::ptr_vector
397 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:27:03 ] C++で動く、フリーなライセンスの行列演算ライブラリはありませんか?
398 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:13:04 ] boost
399 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:34:13 ] boost::uBLASな
400 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:34:47 ] boost::uBLASってパフォーマンスより安全性とかを優先してて遅いとか、 書かれてるけど、実際どうなん?
401 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:48:54 ] boost::numeric::ublasは遅くないぞ パフォーマンス表も書いてある boost.cppll.jp/HEAD/libs/numeric/ublas/doc/overview.htm
402 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:02:54 ] liboctaveより遅いけどな
403 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:07:56 ] そうかもしれんがBlitz++のように途中で更新停止したり するのが怖い boostならまずそういう事はないだろうし
404 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:25:54 ] 確かに。メンテされ続ける安心ってのは大事だな。
405 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:56:56 ] Program Optionsとか放置されてて酷いけどな。 一度使おうとして、あまりにも酷い出来で、ワイド文字対応がなってなかったんで、あきらめた。 内部的には全部マルチバイト文字にしてやがる。 そのため、ワイド文字でデフォルト値とか設定しようとするとコンパイルエラー。 少しいじって、utf16からutf8に変換するようにしてやれば動くが、 わざわざそんなことするぐらいなら、自前で書いたほうがいい。 ありゃ絶対に、一文字は絶対に一バイトで、しかも7bitに収まるって前提の南蛮人の書いたコードだ。
406 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 02:19:23 ] progressbarは?
407 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 03:59:44 ] >>401 ありがとうございました。 ありがとうございました。 ありがとうございました。
408 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 07:53:35 ] >>395 > A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。 これが前提じゃないのか? new してないものは最初から渡せないだろ。
409 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 08:08:55 ] 「渡せない」と「渡さない」の違い
410 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 09:33:28 ] すみません。boost::numeric::ublasを教えていただいた者ですが、 vc8でdebugモードとreleaseモードで結果が異なり、debugモードでのみ正常に動作します。 使用しているboostは1.34ですが、これにはバグがあるんでしょうか? 面倒なのでアップデートしたくないのですが・・・。 boostコード中で警告4267と4244が出てくるのでboostが原因かもしれませんが把捉しかねる状態です。 ご教示願います。
411 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 10:59:43 ] engineering.meta-comm.com/boost-regression/1_34_1/user/numeric-ublas_release.html 1.34.1で悪いけど。 結構厳しいね。
412 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 12:45:56 ] >>397 俺はliboctave使ってたよ もう遅いかもしれないけど…
413 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:07:42 ] C++ 始めたばっかなんですが、 this はなんでポインタなんでしょうか せっかく参照というものがあるのに... そんで、今日は C++ のオブジェクトが自身への参照を self という名前で持てるようにいろいろがんばってました。 具体的には、そのクラスを継承したらクラス定義の中で self が使えるようなクラスを作ろー...と思ってたんですが、うまくいかず。 結局 #define self (*this) しか思いつきませんでした orz こういうんじゃなくって、ちゃんと自分自身への参照をメンバ変数にもつオブジェクトは作れないのでしょうか。
414 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:18:51 ] >>413 別の表記方法がないなら*thisでいいじゃん。表現に揺らぎがなくて結構なことじゃないか。同じものをいろんな名前で表現させるほうが混乱するんでないかい? size length len count distance 同じ意味だったり違った忌みだったり混乱するね。
415 名前:デフォルトの名無しさん [2008/06/28(土) 21:25:04 ] >>413 昔、this = malloc(1); てな構文があったんだよ
416 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:29:05 ] >this はなんでポインタなんでしょうか thisが C with Classes に導入されたときには参照はまだなかった
417 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:31:11 ] JavaからC++への移行は推奨しません。
418 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:47:59 ] selfってことはJavaじゃないと思う
419 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:50:43 ] Object Pascalだね。
420 名前:デフォルトの名無しさん [2008/06/28(土) 21:51:42 ] C++ではboostはデフォなのか?
421 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:51:52 ] 現代版#define BEGIN {ですね、わかります。
422 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:58:28 ] >>420 一部はデフォになりつつある。 まあ、知って損はない。俺も最近使い始めた。今まで知らなくてずいぶん損したと思う。
423 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:59:31 ] >>420 中にはそういう人間もいる(俺もその1人だがな)。 当然、すべての人間にとってそうとは限らない、いつだって使えるとは限らないから、 Boostデフォを妄信するのは危険。使えないときは反動でだるくなる。
424 名前:440 mailto:sage [2008/06/28(土) 22:49:03 ] >442 勉強しておくよ。 GCとか便利そうだし >443 仕事の場合だと、使えない場合が多そうだな。
425 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:50:24 ] 今テレビでターミネーター2やってるよね。 未来から来たって話。
426 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:59:36 ] >>424 440基準でも未来レスかよw
427 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:01:52 ] Testってクラス書くとして Test.cppとTest.h用意? Test.cxx作ってそこに全部記述?
428 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:02:56 ] Testを他で使うなら.hも作っとけ
429 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:05:05 ] Test.hppにテンプレートクラスでイナフ
430 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:11:42 ] hppだとどういうコーディングルールがベスト? サンプルないかな?
431 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:14:01 ] boost
432 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:14:07 ] >>426 意味不明だよ。
433 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:15:01 ] IDテスト
434 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:16:10 ] >>430 hppでの例 www.boost.org/doc/libs/1_35_0/boost/shared_array.hpp ベストかどうかは・・・分からんけど。
435 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:17:05 ] >>432 424 :440 [sage] :2008/06/28(土) 22:49:03 >442 勉強しておくよ。
436 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:18:40 ] >>434 オペレータの定義だけ外だし?
437 名前:413 mailto:sage [2008/06/29(日) 04:39:41 ] >>414 はっきりいってネタですw でもthisが参照じゃないのは何でやろー && 参照だったら Foo& Foo::operator=(const Foo& rhs) { this.bar = rhs.bar; return this; } こんな感じで(->)や(*)使わなくてすむのにと思ったので >>415 kwsk >>416 それじゃあ this が参照じゃないのは後方互換性のためなのか。 かつ *this があるから別の予約語を用意する必要もないと >>419 ざっと見た感じでは self 使ってない雰囲気ですが
438 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:34:32 ] google-styleguide.googlecode.com/svn/trunk/cppguide.xml Google社内でのコーディング規約らしい。例外は悪か、やっぱり。
439 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:55:16 ] >>438 全部読んでないけど、「例外は悪」とは書いてないと思うよ。 Googleの場合はデメリットがメリットより大きいから使わないという話と思う。
440 名前:デフォルトの名無しさん [2008/06/29(日) 14:13:45 ] C++0xがでたら、boostも用済みなんだろうか…というか組み込まれるのか? 最近C++の書籍がどんどん廃刊したり、改訂版が出ないのは、やはりC++0x 待ちなのかな?早くして欲しいもんだ。
441 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 14:16:53 ] boostの一部は標準に取り込まれるが、 標準に新たな機能が追加されるわけで、 boostは更なる進化を遂げるだろう。
442 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 14:17:18 ] coocle
443 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:03:01 ] concept_map使った凶悪なライブラリがきっと入る、絶対入る
444 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:03:44 ] 使わない、って書いてあるけど、 標準ライブラリ等で例外が投げられる奴らはどう使ってるんだろう? 使ってないのか? new も nothrow で使ってんのかね。
445 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:09:02 ] catchしてNULL返す関数でラップしてるとか?
446 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:16:47 ] >>438 > string tableName; // Bad - mixed case. おいらは google で仕事はできない
447 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:19:09 ] Googleに限らずどんな環境にも適合する人じゃないと駄目だよね。
448 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:19:53 ] まあ、その辺は統一取れてりゃ合わせるよ。 よほど変なのでなければ。
449 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:20:16 ] 初心者もれに string tableName; // Bad - mixed case. なんでバッドなんだよって教えて干しいぉ?
450 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:24:31 ] >>449 誰がBADだと言っているのかは知らんが、MixedCaseなのがいかんと言っているだけじゃないか。 要は、caseをmixするなってことだろ。
451 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:26:28 ] 変数名は全て小文字で。単語の区切りはアンダースコアで。 と書いてある。
452 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:28:25 ] コーディング規約に違反しているから bad なだけ
453 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:01:58 ] >>445 std::nothrowって知ってる?
454 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:05:12 ] >>453 標準ライブラリが例外を投げないようにするのに、 どうやってstd::nothrowを使うのか教えてほしい。
455 名前:445 mailto:sage [2008/06/29(日) 17:08:18 ] 知りませんですた
456 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:34:59 ] 標準ライブラリから例外が投げられてもそのままキャッチしないで死ぬ だけ、とか? もしくは標準ライブラリも書き直して使っているとか。
457 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:40:28 ] 俺C++2年以上使ってるけど、例外処理ほとんどしたことない