1 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:04:54 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part66 pc12.2ch.net/test/read.cgi/tech/1231640498/ ※part63, part66 が重複していたようですので part69 としました。
2 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:07:52 ] STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
3 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:09:01 ] ■基本■ [C++ FAQ] www.parashift.com/c++-faq-lite/ www.bohyoh.com/CandCPP/FAQ/ (日本語) Cとその仕様を比較しながらの解説なので分かりやすい。 ***** 質問の前に必ずこの二つに目を通してください ***** [C/C++ リファレンス] www.cppreference.com/ (英語) www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない) [禿 Stroustrup] public.research.att.com/~bs/ [C++ International Standard] www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110 [JTC1/SC22/WG21 - C++] www.open-std.org/jtc1/sc22/wg21/ ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。 [JIS X3014] www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014 ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
4 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:09:17 ] ■Books(Templateまわり)■ Effective STL www.amazon.com/exec/obidos/ASIN/0201749629/ www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳) Modern C++ Design www.amazon.com/exec/obidos/ASIN/0201704315/ www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳) C++ Templates www.amazon.com/exec/obidos/ASIN/0201734842/ C++ Template Metaprogramming www.amazon.com/exec/obidos/ASIN/0321227255/
5 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:09:39 ] ■Libraries■ [Boost] Boost www.boost.org/ (日本語) www.kmonos.net/alang/boost/ (日本語) shinh.skr.jp/boost/ [標準ライブラリ] SGI-STL www.sgi.com/tech/stl/ STLport stlport.sourceforge.net/ GNU libstdc++ gcc.gnu.org/libstdc++/ Apache STDCXX incubator.apache.org/stdcxx/ STLFilt www.bdsoft.com/tools/stlfilt.html (日本語) www005.upp.so-net.ne.jp/episteme/html/stlprog/ (日本語) www.wakhok.ac.jp/~sumi/stl/ [Loki] sourceforge.net/projects/loki-lib/ LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
6 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:12:23 ] 入門ページなど www.cplusplus.com/ ・入門,一覧,使い方 www5c.biglobe.ne.jp/~ecb/cpp/07_01.html ・メソッド一覧 www.wakhok.ac.jp/~sumi/stl/ ・サンプルプログラム集 www.s34.co.jp/cpptechdoc/reference/stl_samples/
7 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:13:06 ] >3-5は古いスレから持ってきたのでリンク切れ等あると思います。 とりあえず、 Apache STDCXX incubator.apache.org/stdcxx/ は Apache C++ Standard Library (STDCXX) stdcxx.apache.org/ というのは指摘済みでした。ごめんなさい。とりあえず訂正。 ■Libraries■ [Boost] Boost www.boost.org/ (日本語) www.kmonos.net/alang/boost/ (日本語) shinh.skr.jp/boost/ [標準ライブラリ] SGI-STL www.sgi.com/tech/stl/ STLport stlport.sourceforge.net/ GNU libstdc++ gcc.gnu.org/libstdc++/ Apache C++ Standard Library (STDCXX) stdcxx.apache.org/ STLFilt www.bdsoft.com/tools/stlfilt.html (日本語) www005.upp.so-net.ne.jp/episteme/html/stlprog/ (日本語) www.wakhok.ac.jp/~sumi/stl/ [Loki] sourceforge.net/projects/loki-lib/ LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
8 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:19:28 ] Boost C++ Libraries www.boost.org/ Boost 翻訳プロジェクト boost.cppll.jp/HEAD/ Let's Boost www.kmonos.net/alang/boost/ boost info shinh.skr.jp/boost/
9 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:52:57 ] 前スレ>>994 std::multisetのoperator>は任意のクラスの比較オブジェクト若しくは 比較関数を定義する時に用いる 挿入順序を決定する struct Set { int a; double b; Set(int i, double d) : a(i), b(d) {} }; bool operator>(const Set& a, const Set& b) { return a.b > b.b; } int main() { std::multiset<Set, std::greater<Set> > ms; ms.insert(Set(1, 2.0)); ms.insert(Set(2, 1.0)); for (std::multiset<Set, std::greater<Set> >::const_iterator pos = ms.begin(); pos != ms.end(); ++pos) std::cout << pos->a << ' ' << pos->b << std::endl; }
10 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:07:51 ] 但し次のような例ではstd::greaterを定義していても暗黙の内に <()std::less)が使われるので定義しておかなければならない。 struct Set { int a; double b; Set(int i, double d) : a(i), b(d) {} }; bool operator>(const Set& a, const Set& b) { return a.b > b.b; } bool operator<(const Set& a, const Set& b) { return a.b < b.b; } int main() { std::multiset<Set, std::greater<Set> > ms, ms2; ms.insert(Set(1, 2.0)); ms.insert(Set(2, 1.0)); ms2.insert(Set(1, 0.0)); ms2.insert(Set(1, 0.5)); for (std::multiset<Set, std::greater<Set> >::const_iterator pos = ms.begin(); pos != ms.end(); ++pos) std::cout << pos->a << ' ' << pos->b << std::endl; if (ms > ms2) std::cout << "ms > ms2\n"; }
11 名前:前スレ>>994 mailto:sage [2009/05/04(月) 22:14:59 ] >>9-10 なるほど。 自作クラスSetに>を実装しないとstd::setやstd::multisetに入れられないのは理解できました。 ありがとうございます。 しかしご教示いただきたいのですが、最後の方の if (ms > ms2) このms>ms2の部分がtrueやfalseになるという決定はどういう基準で決まるということですか? 例えばms == ms2でしたら、「最初から最後まで全要素がmsとms2で等しい時true, 他はfalse」ですよね。 ms>ms2はどうなのでしょうか?
12 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:20:09 ] >>11 これで見る限り木の単純比較のように見えます std::equal()を使っても同じ結果が得られると思います struct Set { int a; double b; Set(int i, double d) : a(i), b(d) {} }; bool operator==(const Set& a, const Set& b) { return a.b == b.b; } bool operator<(const Set& a, const Set& b) { return a.b < b.b; } int main() { std::multiset<Set> ms, ms2; ms.insert(Set(1, 2.0)); ms.insert(Set(2, 1.0)); ms2.insert(Set(1, 1.0)); ms2.insert(Set(3, 2.0)); if (ms == ms2) std::cout << "ms == ms2\n"; }
13 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:23:27 ] あ、size()も見ているようですね size()が等しくかつ単純比較で大小を決めているようです 1,3,5 1,2,6 のような場合はどちらが大きくなるかと、辞書順、つまり 最初に見つかった違いで判断しているようです
14 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:25:14 ] うーんsize()も見ていないのか?そうなるとstd::lexicographical_compareと同じアルゴリズムか? struct Set { int a; double b; Set(int i, double d) : a(i), b(d) {} }; bool operator==(const Set& a, const Set& b) { return a.b == b.b; } bool operator<(const Set& a, const Set& b) { return a.b < b.b; } int main() { std::multiset<Set> ms, ms2; ms.insert(Set(1, 3.0)); ms.insert(Set(2, 1.0)); ms.insert(Set(2, 5.0)); ms2.insert(Set(1, 1.0)); ms2.insert(Set(3, 2.0)); ms2.insert(Set(3, 6.0)); ms2.insert(Set(3, 1.0)); if (ms > ms2) std::cout << "ms > ms2\n"; }
15 名前:11 mailto:sage [2009/05/04(月) 22:47:18 ] >>14 謎ですよね。ありがとうございます。 今、決定打を探してみています。
16 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:52:26 ] 14882:2003 23.1 Table 65 に Container に対する a < b の operational semantics として lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()) って書いてあるよ。
17 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:54:00 ] 多分辞書順だと思うんだけどなあ 手持ちの書籍を読んでもなかなか SGIのホームページを見ると Lexicographical comparison. This is a global function, not a member function. とあるから間違いないと思いますが 規格書を読むと§23.1のTable65にやはり convertible to bool lexicographical_compare linear (a.begin(),a.end(),b.begin(),b.end()) pre: < is defined for values of T. < is a total ordering relation. とあります
18 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 22:54:42 ] かぶったゴメン という事で辞書順という事で決まり・・・みたいですね
19 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:06:37 ] 多分順序が付いているということが大事で、その付け方はそんなに重要じゃないと思う setの入れ子とかが出来るように適当に全順序決めてるだけだろうから
20 名前:11 mailto:sage [2009/05/04(月) 23:09:32 ] 決定打ありがとうございます。 辞書順と言うことはすなわち Rule1:msとms2で「格納している最小の要素」が大きい方を大きいとする。 Rule2:最小の要素が等しい場合は、それを除いてもうRule1を適用する。 Rule3:Rule2により要素が無くなったら、無くなった方が小さいとする。 ということですね。なんか変な定義ですねぇ。。。 ですが ms.insert(Set(2, 1.0)); ms.insert(Set(1, 3.0)); ms.insert(Set(2, 5.0)); ms.insert(Set(2, 7.0)); と ms2.insert(Set(2, 1.0)); ms2.insert(Set(1, 3.0)); ms2.insert(Set(2, 5.0)); ms2.insert(Set(2, 7.0)); ms2.insert(Set(2, 9.0)); とではms<ms2になるらしいですしやっぱりこういうことですよね。 ありがとうございました。
21 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:12:42 ] >>20 std::lexicographical_compare()の動作の仕方を理解できればいいよ
22 名前:11 mailto:sage [2009/05/04(月) 23:15:13 ] いや、そう変に考えなくても単に先頭から見て大きい方を大きいと見なすってだけですね。 setやmultisetが自動でソートされるから紛らわしいと感じるだけでした。
23 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:32:14 ] たまには頭のいい体操になるな
24 名前:11 mailto:sage [2009/05/04(月) 23:34:18 ] >>21 OKです。ありがとうございます。
25 名前:デフォルトの名無しさん [2009/05/05(火) 01:07:29 ] 質問です。 割と大きめの行列にSVD(特異値分解)したいので そういうライブラリを探しています。 それで、liboctave C++を使おうと思い以下のコードを試しに実行してみたのですが、 2x2程度の行列なら、1秒以内に完了するのですが、このコードだと15分たった現在も結果が返りません。 実際に演算にかけたい対象は、更に大きいものなので、これでは使い物にならないのですが・・・ こんなものなのでしょうか?また他に良いライブラリはないのでしょうか?確かSVDに関しては高速化の手法がいくつか考えられてたとおもうのですが・・・ Matrix m(5, 6); m(0,0) = 1; m(0,1) = 0; m(0,2) = 1; m(0,3) = 0; m(0,4) = 0; m(0,5) = 0; m(1,0) = 0; m(1,1) = 1; m(1,2) = 0; m(1,3) = 0; m(1,4) = 0; m(1,5) = 0; m(2,0) = 1; m(2,1) = 1; m(2,2) = 0; m(2,3) = 0; m(2,4) = 0; m(2,5) = 0; m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1; m(3,4) = 1; m(3,5) = 0; m(4,0) = 0; m(4,1) = 0; m(4,2) = 0; m(4,3) = 1; m(4,4) = 0; m(4,5) = 1; cout << "Original Matrix" << endl << m << endl; SVD svd(m); cout << "Left Singular Matrix" << endl << svd.left_singular_matrix() << endl; cout << "Singular Values" << endl << svd.singular_values() << endl; cout << "Right Singular Matrix" << endl << svd.right_singular_matrix() << endl; cout << "Recomposed Matrix" << endl << svd.left_singular_matrix()*Matrix(DiagMatrix(svd.singular_values()))*svd.right_singular_matrix() << endl;
26 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 04:06:33 ] >>25 ソースから作った?あと、ATLAS組み込んだ? ATLASをgcc4&SSE4&マルチコア構成でmakeしてみて liboctaveに組み込めばかなり高速化すると思う。 SVDの演算ならそんなもんだよ。 そんなに速度が欲しいなら、精度無視してNNを使った方法を取ったら?
27 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 09:48:54 ] std::map<std::string, Myclass> the_map; で、存在しないキーを指定してアクセスした時はそのキーが自動的に登録されそのキーに対応する値はその値の型のデフォルトコンストラクタによって初期化されると聞きました。 試したところ、たしかにthe_map["this key doesn't exist."]とするとその値はMyclass()で初期化されていました。 では std::map<std::string, int> the_map; だった場合も大丈夫なのでしょうか? g++ではthe_map["this key doesn't exist."]とするとその値はint()で初期化されて0になっているようですが、これは他の環境でも期待して良い物でしょうか?
28 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 10:08:19 ] >>27 引数なしのコンストラクタが呼ばれます
29 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 10:39:31 ] intとかについては T() の結果がマチマチじゃなかったかねえ
30 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 10:40:13 ] >>28 はい、それですと、 int型のクラスで言うところのデフォルトコンストラクタ により0で初期化してくれるのですか? たとえばstd::string str;だとデフォルトコンストラクタにより""になりますけど int i;だと初期化されませんよね。 ・・・と思いましたが、そう言えばint()で0が返るんでしたね 失礼しました。
31 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 10:42:00 ] >>29-30 組み込み型でもT()で全て初期化してくれるんじゃなかったか? 誰か有識者plz
32 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 11:02:21 ] 8.5あたりに書いてあるな イニシャライザが空の括弧(要するに()のこと)の場合はdefault-initializeされ、 PODに対してのdefault-initializeとはzero-initializeであって、 スカラー型に対してのzero-initializeとはその型での値0をセットすることである と決められてる だからint()は0初期化が保証されてると考えておk ちなみにint i;みたいなのは「イニシャライザなし」であって()で初期化する場合とは区別される イニシャライザなしの場合は非PODはdefault-initializeだが、PODの場合は不定値と決まっている
33 名前:30 mailto:sage [2009/05/05(火) 11:07:19 ] >>32 理解出来ました! ありがとうございました。
34 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 11:41:15 ] pimplのインターフェースクラスのメンバ関数の実装はどこに書くべき? 具体的には↓↓ pimplイディオムを使うことを想定してMyClassとMyClass_implを定義した。 class MyClass_impl; class MyClass { boost::shared_ptr<MyClass_impl> pimpl; public: int foo(); //以下略 }; ここで、MyClassのpublicメンバ関数int foo()からMyClass_implのメンバ関数int foo()を呼び出すように int MyClass::foo() {return pimpl->foo();} と定義しろと学んだんだが、これはどこに書くべきなの? 実装ファイル.cpp(MyClass_implの定義と実装が書かれている)に書くべきなのか、 それともMyClassクラスの定義されたヘッダファイル.hに書かないと意味ないの?
35 名前:34 mailto:sage [2009/05/05(火) 11:44:16 ] ただしMyClassクラスの定義されたヘッダファイル.hは 変更されないように極力努めるが、 実装ファイル.cpp(MyClass_implの定義と実装が書かれている)が しょっちゅう変更される物として。 お願いします。
36 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 12:33:26 ] >>35 MyClass.cppでfooの実装とMyClassImpl.hをインクルードすれば済むんじゃね?
37 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 13:56:10 ] 別にimplがクラスである必要はネエ、PODでもOKと考えれば判ること。 cpp内でPOD*をキャッチボールしたりコンストラクタが役立たずになったりして コンパイラの最適化お仕事の邪魔になるだろうけど
38 名前:34 mailto:sage [2009/05/05(火) 14:53:46 ] ふむ、となると、 int MyClass::foo() {return pimpl->foo();} これはどこに書くといいのかい?
39 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 15:17:54 ] そもそもそれヘッダに書けるの? MyClass_implの定義は実装ファイル.cppに書かれてるんでしょ?
40 名前:34 mailto:sage [2009/05/05(火) 15:26:33 ] >>39 あ・・・そもそもMyClass_implが不完全型だから fooを持っているかどうか分からないから書けないのか。 ごごごごごごごめん 正直すまんかった。
41 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 15:32:19 ] >>38 cppに書けば実装を隠蔽できる
42 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 15:33:02 ] >>37 ん?ClassとPlain Old Data、どっちで_implを実装すべきだというのだい? 興味あるからその辺の話を聞かせてほしい。
43 名前:34 mailto:sage [2009/05/05(火) 15:35:27 ] >>41 pimplには実装の隠蔽という役割もあったか。 よし、本気で勉強してみるわ。thx
44 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 15:44:06 ] POD*を丸々投げ返す様なローカル関数が無けりゃどっちでも良いんじゃないかな
45 名前:42 mailto:sage [2009/05/05(火) 15:46:08 ] >>44 ほう、特にどちらでもおk、と。 どうも。
46 名前:42 [2009/05/05(火) 23:18:16 ] しかし中々興味深いな。 明確な解ではないとはいえ、私の情報論理構成の範疇外の事象とは。 おっと、言葉が過ぎたようだ。また組織から小言をもらってしまう。 では。
47 名前:42 mailto:sage [2009/05/05(火) 23:28:50 ] >>46 おい成りすますなよ オレオレ詐欺かw
48 名前:42 mailto:sage [2009/05/06(水) 02:15:10 ] 私はバカです。
49 名前:42 mailto:sage [2009/05/06(水) 02:16:48 ] 釣れた!
50 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 12:26:54 ] std::cout << HOGE << ':' << PIYO << std::endl; みたいに書く時って、 std::cout << HOGE << ":" << PIYO << std::endl; とどっちがいいの?
51 名前:デフォルトの名無しさん [2009/05/06(水) 13:18:40 ] どちらでもお好きに。
52 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 13:20:44 ] 1バイトのみの出力であれば、「NUL文字までループ」しない分、前者の方がわずかながら速いだろう。 しかし気にするほどではない。
53 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 13:24:50 ] 考え方によっては":"が何回も出て来るなら、 同じ文字列をマージする最適化をコンパイラが行うとかは考えられない?
54 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 14:13:20 ] 考えたくない
55 名前:11 mailto:sage [2009/05/06(水) 14:19:35 ] また来てすみません コンテナのa < b lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()) sed::setの場合は格納している値を辞書式に比較すると言うことでしたが、 std::mapの場合はどうなるのでしょうか? mapの格納している要素はkeyと値の組になっていますが どちらで比較するのでしょうか? サンプルソース C++ code - 51 lines - codepad ttp://codepad.org/XOdZ3Avt mymap<yourmapがtrueとなるのは Rule1:mymapの最初のkey < yourmapの最初のkey の時。 Rule2:(mymapの最初のkey == yourmapの最初のkey) ならば (mymap[key]で得られる値 < yourmap[key]で得られる値) の時。 Rule3:最初のkeyも最初の値も同じなら、次の要素でRule1, Rule2を適用する。 Rule4:Rule3にてmymapの方がyourmapより先に次の要素が無くなった時。 といった感じがするのですが、ご存じの方いらっしゃいますか?
56 名前:50 mailto:sage [2009/05/06(水) 14:20:47 ] >>51-54 どうでも良い程度の差ってことか。 どうも。
57 名前:デフォルトの名無しさん [2009/05/06(水) 14:25:31 ] VS2008をダウンロードして起動してみたのですが、 全くどう使っていいのかわかりません… 画像付きで解説してるサイトはありませんか? とりあえずハローワールドすら出来ないと泣きそうです VBAなら少しさわったことあります よろしくお願いします
58 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 14:28:56 ] >>57 ★初心者にVisual C++を教えるスレ★ Part33 ttp://pc12.2ch.net/test/read.cgi/tech/1235292263/
59 名前:デフォルトの名無しさん [2009/05/06(水) 14:29:25 ] msdn.microsoft.com/ja-jp/library/szatc41e.aspx
60 名前:デフォルトの名無しさん [2009/05/06(水) 14:33:21 ] >>58 おお、そんなスレがありましたか失礼しました >>59 ありがとうございます!
61 名前:11 mailto:sage [2009/05/06(水) 15:31:33 ] >>55 ・・・な〜んか違うよーな。 コンテナの比較って相変わらず分からないです。
62 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 15:39:41 ] >>61 あってんじゃね?俺も知らんけど、見た感じそうなってると思う。
63 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 15:56:35 ] その理解でいいだろ。 lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()) は対応するイテレータがそれぞれ参照している要素をoperator<で比較していく。 mapのイテレータが参照しているのはpair<key_type,mapped_type>。 pair<first_type,second_type> x,y に対して x < y が真になるのは x.first < y.first または !(y.first < x.first) && x.second < y.second が真になるとき。
64 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 15:58:48 ] >>63 × !(y.first < x.first) && x.second < y.second ○ y.first == x.first && x.second < y.second
65 名前:64 mailto:sage [2009/05/06(水) 16:07:08 ] あ、pairって等価ベースだったか。すまん。
66 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 17:49:02 ] 本を買って通勤中や暇な時間に勉強しようと思うのですが、 オススメはありますか? 上の方のレス見たらそんな本は捨てた方がいいとか書いてあって怖くなりました(間違った知識がつくんじゃないかと) とりあえず古本屋も見てみたのですが、10年ぐらい前のしかありませんでした…
67 名前:デフォルトの名無しさん [2009/05/06(水) 17:56:43 ] やさしいC++ 第3版
68 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 17:58:45 ] ありがとー! さっそく買ってきます
69 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:11:35 ] レビューとか読んでからにしろよ。
70 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 19:36:39 ] 教えてください、以下のプログラムでいい方法がないものかと。 またはC++的にはこう書いた方が正しい等です。 //------------------- class AA { int a1; }; //------------------- class BB { AA **app; void setapp(int no) { app = new (*AA)[no]; //<-ここが不明 エラーになる } }; //------------------- int _tmain(int argc, _TCHAR* argv[]) { BB dat; dat.setapp(10); } 1.<−−ここが不明の部分の書き方 2.こんなのは良くない、もっといい方法がある。 の2つです。お願いします。
71 名前:11 mailto:sage [2009/05/06(水) 20:30:32 ] >>62-63 ありがとうございます。 最終的には、>>55 の見解で良いとのことですが、 (pairが)等価ベースとはどういう事でしょうか?
72 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:34:12 ] >>70 エラーメッセージが読めるようになってからまたお越し下さい。
73 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:37:40 ] >>70 もしかして多言語の経験者かい?
74 名前:70 mailto:sage [2009/05/06(水) 20:43:33 ] error C2226: 構文エラー : 'AA' 型指定子の前あるいは内部で構文エラーが発生しました。 エラーメッセージは上記です。 正直わからないから聞いているので。 答えられないのであればあきらめます。
75 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:45:14 ] >>74 > 答えられないのであればあきらめます。 ああそうか、じゃあ俺の頭じゃ答えられないわ。
76 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:46:35 ] app = new AA*[no];
77 名前:70 mailto:sage [2009/05/06(水) 20:52:41 ] >>76 出来ました、ありがとうございます。 所で、クラスの配列を動的に作ってアクセスする場合。 この様なポインターの配列をnewしてクラスデーターを入れて管理するのは。 ごく普通のやり方でしょうか? どうもなんか、いまいちなような気がして・・・
78 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:53:01 ] >>70 > 2.こんなのは良くない、もっといい方法がある。 強いて挙げると newで得た配列はデフォルトコンストラクタでしか初期化されません。 ポインタの(と言いますか組み込み型の)配列となると全く初期化されませんけど大丈夫ですか? ということと setappがpublic:じゃいのでアクセスできませんよ。 ということと 忘れずにdeleteしてくださいね ということと もしかしたらnewで例外が発生するかもしれませんよ ぐらいかな。
79 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 20:57:12 ] 一応、std::vector を使うのがいいかなと思う。std::vector<AA*> って感じ。 これでも>>78 の問題はほとんどそのままだが。
80 名前:78 mailto:sage [2009/05/06(水) 20:58:23 ] >>77 そもそも>>70 だとAAのインスタンスは一つも存在していないんだけど、 それは分かっている?分かっていない?
81 名前:70 mailto:sage [2009/05/06(水) 21:00:59 ] public:忘れてました、すみません。 最終的に //------------------- class AA { int a1[10]; }; //------------------- class BB { public: AA **app; void setapp(int no) { app = new AA*[no]; //<-ここが不明 } }; //------------------- int _tmain(int argc, _TCHAR* argv[]) { BB dat; dat.setapp(3); dat.app[0] = new AA(); dat.app[1] = new AA(); dat.app[2] = new AA(); } こんな感じでうまくいったのですが、本当にこのままでいいのだろうかという疑問が・・・
82 名前:70 mailto:sage [2009/05/06(水) 21:06:15 ] std::vector 使ったことないです、調べて見ます。ありがとうございます
83 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 21:08:14 ] あとはboost::ptr_vector<AA>とか
84 名前:78 mailto:sage [2009/05/06(水) 21:10:22 ] >>81 > こんな感じでうまくいったのですが、本当にこのままでいいのだろうかという疑問が・・・ >>78 にあるとおり、良くない。 いつdeleteするかとか、newが4回あるうちのどこかで例外が発生しうるがその時はどうするかとかは? たぶんboostないしstd::tr1のshared_ptrが必要になるのではないでしょうかね。 ・・・ってstd::vector使ったこと無いのか。 じゃあまずSTLのお勉強だな。
85 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 21:14:26 ] STLの前にポインタの勉強からじゃ
86 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 23:45:57 ] 構成上、どうしてもコンストラクタで例外を投げたいんだけど、 良いんだよね?別に。 そう言うこともあるよね?
87 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 23:50:53 ] 某サイトで「コンストラクタで例外を投げるな」なんて書いた人がいたけど 基本的には問題ないし、コンストラクタで正常にオブジェクトの構築が出来ないときは 例外を投げるのが最も適切。 もし、気になっている問題があるなら、具体的に書いてもらってもいいけど。
88 名前:デフォルトの名無しさん [2009/05/07(木) 00:05:27 ] >>86 全く問題ないよ。
89 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:13:08 ] >>71 > (pairが)等価ベースとはどういう事でしょうか? その元レスは直前のレスに対する独り言のようなものだろうから文面をそのまま受け取っては駄目。 おそらく以下の説明のようなことを踏まえての発言。 pairのoperator<はまずfirst同士を比較して、それが等しければsecond同士を比較するという流れ。 ここで等しければを判定するのに等値かどうかで判定するのではなく等価かどうかで判定する。
90 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:21:12 ] >>86 後始末が必要なものをしっかりかたづけてればおk。 A(){ h = gethandle(); // 後で明示的に解放する必要あり /* このあとに例外投げるかもしれない処理を行う */ } ~A(){ releasehandle(h); } みたいな場合、例外をコンストラクタの外に投げる前に後始末が必要。
91 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:32:28 ] 「解放すべきもの(newで確保されたメモリや、その他のリソースなど)を保持してデストラクタで解放する」 という仕事をするためのクラスを利用すると、例外に対処しやすい。 そういうクラス自体の設計時は例外安全に注意する必要がある(コンストラクタでうかつに例外を投げてはならない) が、そういうクラスの利用者のほうは適当に例外を投げてもリソースリークが起こらないようになる。
92 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:44:59 ] 日本語でおk
93 名前:91 mailto:sage [2009/05/07(木) 01:02:48 ] >>92 は俺に言ってる? 例えばスマートポインタを使う場合が最も分かりやすい。 次のようなクラス MyClass があったとする。 class MyClass { public: MyClass(); ~MyClass(); private: MyAnotherClass* p; }; で、MyClass::MyClass() の内部で p = new MyAnotherClass(); などとして、 MyClass::~MyClass() で delete p; しているとする。この場合、MyClass::MyClass() が迂闊に例外を スローすると、MyClass::~MyClass() が実行されないためにpが解放されない場合があるから、 例外をスローする場合はpの解放がきちんとされるように、注意深くコードを書かなければならない。 ただし、メンバ変数 p をポインタではなくスマートポインタとすると、そのような注意は不要となる。 例えば std::auto_ptr<MyAnotherClass> p; となっていて、MyClass::MyClass() の内部で p(new MyAnotherClass()); とした場合、たとえMyClass::MyClass()が例外をスローしても newされたものはちゃんと解放されるから、神経質にならなくて済む。 忘れてはならないのは、スマートポインタのコンストラクタが迂闊に例外をスローしてしまうと、 結局、リソースリークの可能性は消えないということだ。まあ自分でスマートポインタを書いて使うことは 普通の人はないと思うけど、実際 boost::shared_ptr 等はコンストラクタで例外を投げる場合があり、 その場合でもリソースリークが起こらないようにちゃんと配慮されている。
94 名前:91 mailto:sage [2009/05/07(木) 01:08:31 ] ごめん、std::auto_ptr 使って p(new MyAnotherClass()); は無いね。 コンストラクタのメンバ初期化子に書いたと思ってくれ。
95 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 08:24:20 ] >>91 「そういうクラス」「そういうクラスの利用者」って何? 「そういうクラスの利用者『のほう』」って何と比べてるの?
96 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 10:34:03 ] >>95 文脈から明らかでないか?
97 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 11:10:34 ] 明らかじゃないから聞いてるんだろ。 明らかだと思うなら、どう明らかか書けばいい。
98 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 11:16:18 ] 例えば、>>93 が>>91 の説明であるならば、 >>93 に登場するクラスのどれが、「そういうクラス」に相当するのか?
99 名前:11 mailto:sage [2009/05/07(木) 11:35:51 ] >>89 等値(equality) a == b 等価(equivalence) !(a < b) && !(b < a) これの事ですね。 ありがとうございました。
100 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 11:36:10 ] >>98 std::auto_ptr とか boost::shared_ptr とかが「そういうクラス」。