- 1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ]
- C++標準ライブラリの一つ、STLについて。
前スレ 【C++】STL(Standard Template Library)相談室 8 pc11.2ch.net/test/read.cgi/tech/1198435319/ 過去ログ・リンク・書籍紹介は >>2 以降
- 541 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:19:18 ]
- テンプレートライブラリはクラスのマクロみたいなもんですよね?
コンパイル時に全部展開されるので多用する場合はメモリを無駄に消費しそうなんですが、 比較的大規模なアプリを作るときは、やはりコンパイル済みのライブラリを使うべきなんでしょうか? 例えばMFCとSTLはどのように使い分けるのが賢いんでしょうか。
- 542 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:48:06 ]
- 同じテンプレートを同じ型で別の場所でインスタンス化した場合はリンカが重複を除去する場合が多い
なので、規模が大きくなるほどテンプレートのオーバーヘッドの割合は減少すると思う MFCとSTLでは重複するのはコンテナくらい コンテナはSTLの方が大分出来が良いので、基本的にコンテナはSTLのを使えば良いと思う MFCにべったり近い処理をするときなどは専用のコンテナが使いやすいこともあるかもしれない 結局はケースバイケースかな
- 543 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:08:54 ]
- >リンカが重複を除去する場合が多い
重複除去は仕様。必ず行われる。
- 544 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:22:41 ]
- 重複除去しないとstatic変数のユニーク性が保証されなくなる。
- 545 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 06:04:20 ]
- >>541
例えば CODE セグメントとか .text セクションが 10 倍になって困るのか? 一割り増しでも困るなら、使うのをやめというたほうがいいだろう。 なんというか、なんでもいいから毎月雑誌読もう。二年もするとだいぶ変わる。
- 546 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 07:27:13 ]
- コピペ思い出した
- 547 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 12:17:37 ]
- boostで重いやつ(regex、spiritなど)を多用するとメモリ不足になる(VC++なら/Zm指定要求してくる)
さらに酷いとコンパイラやリンカが落ちる。 STLレベルならそこまでのことにはならないが、テンプレートの副作用だな。
- 548 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 12:21:04 ]
- lambdaなんか使うとtypoが原因でコンパイラが落ちるからなw
- 549 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 23:25:01 ]
- それはメモリ不足とは別。
- 550 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:26:13 ]
- vectorって単なる動的配列として使ってもOKですか?
たとえば、こんな風にバッファとして直接vectorに値を書き込むのはvectorの使い方として適切? std::vector<char> TestV; TestV.resize(MAX_PATH); ::GetCurrentDirectory(TestV.size(),&(TestV[0])); std::cout<<&(TestV[0])<<"\n";
- 551 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:27:32 ]
- なぜstringを使わない?
- 552 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:43:05 ]
- >>550
vectorの内部バッファの連続性は規格で保証されているのでok >>551 現時点ではstringの内部バッファの連続性は保証されてなかった気がする。
- 553 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:44:54 ]
- 別に連続性云々じゃなくて……
まあいいや。
- 554 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:54:28 ]
- 文字配列でない配列にstringを使う方が頭おかしいだろ
そんなコードさわりたくねえ
- 555 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:57:50 ]
- vector<char>って書いて有るじゃん
- 556 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 10:24:53 ]
- std::string str=string(&(TestV[0]));
std::cout<<str<<std::endl; とでも書かないと満足できない人なんだよ、きっと。
- 557 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:11:20 ]
- >>553
「まぁいい」って、>>551を書いた根拠がまさにそれで、 立場が無くなって言葉濁してるだけでしょ?w
- 558 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:17:31 ]
- も前らおちつくんだ
- 559 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:31:26 ]
- &(TestV[0])でポインタ得るのはどうよ
- 560 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:39:25 ]
- &TestV[0]
- 561 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 20:31:27 ]
- &*TestV.begin() ならマジックナンバーが現れなくていい
とか言いたいのかな
- 562 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 21:31:08 ]
- vector::data()はまだ規格に入ってないんだっけ?
- 563 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 22:13:29 ]
- >>562
C++0x
- 564 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 23:33:58 ]
- 自分用のライブラリで、
2箇所でSTLを取り入れただけで、.libのファイルサイズが3倍になったんだけど テンプレート導入でサイズ急膨張って常識なんすか?
- 565 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:08:32 ]
- :テンプレートは結局、自動的にコードを生成する機能といえるのでうまく使わないと予想外にコードが大きくなる。
- 566 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:27:48 ]
- STLを使うとコードが10倍に?
- 567 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:28:44 ]
- >>564
デバッグ情報じゃねーの?
- 568 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 02:42:07 ]
- 元のライブラリが10KByteで30KByteになったとかだったら驚かない。
3MByteが9MByteになったとかだったら、なにやったんだよと思う。
- 569 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 02:46:15 ]
- シンボル情報削れば大したことにならんと思うが
- 570 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 10:31:54 ]
- OSもコンパイラもそれらのバージョンも言わずに3倍とな!?
- 571 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 12:38:03 ]
- コンパイラはg++です
- 572 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 12:50:12 ]
- VC++でexpressive入れた途端に未最適化コードとmapファイルが1MB増えた覚えはある
- 573 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 21:44:52 ]
- >>561
そこは &TestV.front() だろ・・・常考。
- 574 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 02:04:01 ]
- STLスレだけにテンプレ通りの話をしてるのですね
- 575 名前:デフォルトの名無しさん [2008/05/28(水) 22:48:49 ]
- template<class T>
class ListEx { list<T> m_list; list<T>::iterator m_itr; }; iterator の行でエラーになります。 何がいけないのでしょうか?
- 576 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:52:47 ]
- typename list<T>::iterator m_iter;
- 577 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:57:16 ]
- >>576
ありがとうございます エラーは出なくなりました。 でも、 typename がなぜ必要なのかわかりません。 どこを調べたらいいのでしょうか?
- 578 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 23:14:34 ]
- >>577
一度、Effective STLを読んでおいた方がいいんじゃないか?
- 579 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 23:20:22 ]
- >>577
www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=C%2B%2B+template+typename&num=50
- 580 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 23:22:34 ]
- 型なのかメンバ変数なのかハッキリしろコラァ!
とコンパイラが怒るから
- 581 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 10:23:16 ]
- この文脈では list<T>::iterator のTは型に決まってるだろ、と小1時間ほど問い詰めてやりたい
- 582 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 10:31:12 ]
- Tじゃなくて、iteratorが型かどうかわからない。
- 583 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 11:24:32 ]
- template<typename T> struct list{ enum{ iterator = 0 }; };
だったらlist<T>::iteratorをする時にはtypenameの代わりに何が必要なのか
- 584 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 12:45:15 ]
- >>583
何もいらない。 typenameがないときは、暗黙のうちに値として扱われるよ。例外もあるけど。
- 585 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 12:50:33 ]
- >>581
実際VC++だとtypename無くても通るっぽい? 賢いというよりテンプレート宣言を読むときは「あーはいはい」って感じで 実際に型当てはめてからチェック開始してるのかね
- 586 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:36:19 ]
- >>582
なるほど、 typename list<T>::iterator m_iter; は list<T>::iterator がタイプ名だとコンパイラに教えているのか やっと納得できた
- 587 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:04:10 ]
- C++続けるつもりなら読むべきものをまず読んどけ
- 588 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 02:06:07 ]
- SICPですね、わかります
- 589 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 02:43:43 ]
- SICPとはまた時代遅れの物を
- 590 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:33:28 ]
- TR1のお勧め参考書おしえてくれ
- 591 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:40:10 ]
- >>590
つTechnical Report 1
- 592 名前:デフォルトの名無しさん [2008/05/31(土) 01:30:22 ]
- ちょっと質問です。
STL辺りに「テーブルクラス」なんてありますか? イメージとしては、データベースのテーブルをオブジェクトとして扱うクラスです。 result = DBDATA.summary(var1) ; こんな感じです。
- 593 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:36:59 ]
- >>590
EffectiveC++の第三版はtr1にちょっと触れてる
- 594 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:56:28 ]
- >>592
イメージとしては、データベースのテーブルをオブジェクトとして扱う クラスはない感じです。
- 595 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 12:12:08 ]
- >>592
STLだけでやるなら、連想系コンテナとアルゴリズムを組み合わせる感じかね。
- 596 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 12:19:01 ]
- >>590
とりあえずboost本買ってみるのは
- 597 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:49:33 ]
- >>592
where句が限定されているならmapでいいんじゃないの? っていうかDB的に使うなら普通にsqliteでも使った方が無難だよ。
- 598 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:20:14 ]
- O/Rマッパーが欲しいんじゃね
DataSetとか
- 599 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:37:03 ]
- mapは、要素の追加または削除を行ってもそれ以外の要素の参照は保たれたままな事が保証されていますか?
- 600 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:38:01 ]
- 追記です。要素への参照の他に、キーのについても同じ事が言えますか?
- 601 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:40:26 ]
- 自己解決しました。ありがとうございました。
- 602 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:09:11 ]
- 死ね
- 603 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:43:37 ]
- 死ねっていう奴と
死ねって言われた奴は 死ねばいいのに
- 604 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:59:17 ]
- そして伝説へ・・・
- 605 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:06:56 ]
- 死んでもそれ以外の人の参照は保たれたままな事が保証されていますか?
- 606 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:00:47 ]
- 死して屍拾う者なし、ってメモリリークのことですか?
- 607 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:44:19 ]
- GC「骨くらいは拾っておいてやるよ」
- 608 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:45:30 ]
- デストラクタ「生ける者の為の卒塔婆」
- 609 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:11:39 ]
- std::mapのイテレータに順ずるものから、木構造の右部分木、左部分木をそれぞれ取得して
木を追跡したいんですが、そういうことは可能でしょうか?
- 610 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:13:10 ]
- 赤黒木使ってたら左部分木と右部分木だけとは限らないよ
アルゴリズムの本読んでみ
- 611 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:17:24 ]
- >>609
std::map が木で実装されているとは限らないので、そういう操作は無い。 木の追跡(?)自体がやりたいわけじゃないと思うんだけど、結局のところ何がしたいの?
- 612 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:26:33 ]
- >>611
upper/lower_boundで解決しました。
- 613 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:36:39 ]
- やっぱり解決しませんでした。もういいです諦めます。STL死ね。
- 614 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:41:17 ]
- お前が死ね
- 615 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 14:21:17 ]
- すぐファビョる所を見ると朝鮮人か
- 616 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 14:23:03 ]
- 私が死ぬのであなた達は死ななくてもよいのです
- 617 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:05:12 ]
- STLは生き物ではないので死ぬことはできません
- 618 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:18:03 ]
- 私のお墓の前で泣かないでください
- 619 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:46:50 ]
- STLの考え方に頭が付いていかない所を見ると
頭が悪いかジジイかのどちらかだろう
- 620 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:07:29 ]
- お尋ねします。
vector<vector<bool>> TempA; vector<vector<bool>>::iterator itr1; vector<vector<bool>>::iterator itr2; と宣言したとします。 itr1 = TempA.begin(); itr2 = TempA.begin(); としたのち、 TempAのたとえば2行目と3行目の中身すべてを比較したいとき、 itr1++;itr2 += 2;としてiteratorを進めて、 *itr1 == *itr2の比較を一度行えばいいのでしょうか? それとも、各行でiteratorを作成して、 各行ベクトルの列座標に対応したiteratorを回す必要がありますか? p.s.この動作のあと、一致している行を、 itr2=Temp.erase(itr2); みたいに削除したいのです。
- 621 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:34:38 ]
- >>620
要するに二つのvectorを==で比較できるかってことだよな できるよ
- 622 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:46:22 ]
- >>621
ありがとうございます。 行に対応するvectorの各要素の比較という認識で大丈夫でしょうか。
- 623 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:17:13 ]
- そう。要素ごとに==で比較してる
- 624 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:19:40 ]
- >>622
23.1 Container requirements に a == b は a.size() == b.size() && equal(a.begin(), a.end(), b.begin()) と等価と書いてある。
- 625 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:12:31 ]
- >613
map使わずにソート済vector使えばいいんじゃね?
- 626 名前:620 mailto:sage [2008/06/05(木) 10:43:24 ]
- >>623
亀レス申し訳ない。 ありがとうございました。 そういう情報ってどのヘッダーを見ればいいんでしょうか? vector.hを眺めていてもさっぱりです…。
- 627 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:34:56 ]
- >>626
ヘッダーには書いてないだろう・・・ お使いのコンパイラのリファレンスマニュアル等を読め VCならこのへん↓ msdn.microsoft.com/en-us/library/5asks2ba(VS.80).aspx
- 628 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:25:16 ]
- >>626
C++の規格書一回読んでみるのもいい。
- 629 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:20:37 ]
- vectorかその内部でincludeしてるファイルに書いてあるんじゃね。実装が。
- 630 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:17:16 ]
- イテレータを返すbegin, endが、どうして戻り値の型が違うだけで(iterator, const_iterator)オーバーロードされた関数を特定できるのかが分かりません。
自分で同じ様な事をしようとしてもSTLとは違いコンパイラが関数を特定できずに失敗します。
- 631 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:22:06 ]
- >>630
戻り値の型じゃなくて、引数リストの後ろの const の有無が違う。
- 632 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:36:05 ]
- >>631
それは実装側のbegin, endの定義ですよね? 自分で作ったものもconst_iteratorを返すものは引数リストの後にconstをつけているんですが、 これは利用する側が呼び出すときには特に関係ない様です。 まさか container_type::const_iterator it = ((container_type::const_iterator (container_type::*)()const)container.begin)(); なんてしなきゃいけないんですか?
- 633 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:24:47 ]
- iteratorからconst_iteratorへの変換はできるようになってる?
- 634 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:27:59 ]
- 変換できるようにしたら const_iterator begin() const の必要性なくならないか?
- 635 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:31:44 ]
- なんで?
constなインスタンスに対してイテレータ取得できなくなっちゃうじゃん
- 636 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:59:04 ]
- VC7
template<class _Ty,class _Alloc> class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc>
- 637 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 19:44:07 ]
- >>636
補足しとくと、iteratorは基底クラスであるconst_iteratorに変換できるといいたいだけ。 constなしbegin()の戻り値はiteratorだからconst_iteratorにも変換されうる。 begin()の戻り値を渡す先がconst_iteratorかiteratorかで、 begin()の種類(後ろにconst付きか否か)が選択されているわけじゃない。
- 638 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:14:29 ]
- >>632
MyContainer c = ... MyContainer const& cc = ... MyContainer::const_iterator = c.begin(); MyContainer::const_iterator = cc.begin(); これをトレースするといいよ。
- 639 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:30:21 ]
- なるほど、constなメンバ関数はオブジェクトがconstな時に使用されるんですね。
- 640 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:26:16 ]
- constメンバ関数と非constメンバ関数が両方ともある場合はそうなる。
非constメンバ関数がない場合は非constオブジェクトからもconstメンバ関数が呼ばれる。
- 641 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:31:07 ]
- \n とか \r\n とかが入った文字列を SetDlgItemTextすると
char のときはちゃんと改行してるのに string だと改行されずに何も表示されないわけですが string って \n とかとは別に改行とかタブコードがあるんでしょうか?
|

|