1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ] C++標準ライブラリの一つ、STLについて。 前スレ 【C++】STL(Standard Template Library)相談室 8 pc11.2ch.net/test/read.cgi/tech/1198435319/ 過去ログ・リンク・書籍紹介は >>2 以降
477 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 15:07:11 ] >>475 class my_string : public std::string { bool m_is_null; public: my_string() : m_is_null(true) {} operator=(const char* p) { if (p==NULL) set_null() else set_string(p); } operator=(const std::string& s) { set_string(s); } void set_null() { m_is_null = true; clear(); } void set_string(const std::string& s) { m_is_null = false; *this = s; } bool is_null() { return m_is_null; } }
478 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:30:54 ] >>477 実は同じのを作って使ってるんだ。でもありがとう。
479 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:58:46 ] Concrete Containerをplubic継承www
480 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:02:34 ] と笑う人もいるので、抽象化して template <class T> Nullable : public T { ... }; などしておいてはどうだろうか
481 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:14:25 ] 仮想デストラクタのないクラスはpublic継承しちゃだめだろ常識的に考えて・・・
482 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:16:28 ] delete されるような場面でアップキャストしなけりゃ良いんじゃね?
483 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:16:43 ] すると笑う人は笑わないのか?
484 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:26:28 ] 結局boost::optional自作になるのか
485 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:42:08 ] なんで継承したがるんだ
486 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:01:00 ] 楽にかつ安全に特徴を追加する方法って無いのかねぇ…
487 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:33:02 ] 普通にオーバーロードを活用すればいいんじゃね? >486
488 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:14:23 ] std::string * でいいような…それかboost::optional<std::string>
489 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:12:47 ] const char *でいいだろ・・・
490 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 02:04:55 ] 話は逸れるけど、逆にnullが存在し得る参照型Stringを持つJava/C#を触ると、 nullの存在がうっとおしいと思うときがあるから不思議。
491 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 07:19:30 ] ぬるぽ
492 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 08:13:15 ] >>490 そうそう、無効値としてnullか""のどちらにするか結構悩む。
493 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 11:55:38 ] std::iterator は仮想デストラクタないけど public 継承していいんですか?
494 名前:デフォルトの名無しさん [2008/05/09(金) 13:04:18 ] EBOがあるからいいんじゃないか?
495 名前:デフォルトの名無しさん [2008/05/09(金) 13:06:26 ] 間違えたw 気にしないで・・・。
496 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:17:01 ] >>493 typedefしかしてないクラスだから、public継承しないと意味無いと思うけど。
497 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 15:25:34 ] このほうが安全じゃない? class my_iterator : private std::iterator<Tag, Type> { typedef std::iterator<Tag, Type> super_t; public: using super_t::iterator_category; using super_t::value_type; using super_t::difference_type; using super_t::pointer; using super_t::reference; };
498 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:20:17 ] std::iterator や std::unary_function のようなクラスは protected な非仮想デストラクタが定義されていればいいのに。
499 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:23:23 ] >>498 自分が何言ってるかわかってるのかw
500 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:53:04 ] それ自身インスタンス化することないし、基本クラスとして使うこともないし いいじゃないの?
501 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:07:08 ] データメンバもメンバ関数もないクラスにアップキャストしても 何もいいこと無いからな
502 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:56:40 ] マーカインタフェースという概念があってだな。
503 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 20:22:33 ] >>499 C++ Coding Standardsの50項目目に紹介されている。
504 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 20:30:15 ] ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1755.html#257 で提案している人がいますね。 反論もあるようです。
505 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:04:17 ] 反論の根拠ってなんでしょうか。
506 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:04:56 ] >>504 に書いてある
507 名前:505 mailto:sage [2008/05/09(金) 21:13:02 ] そこの部分だけ一回で理解できなかったのですが、理解できました。ありがとう。具体的なケースはよく分かってませんが。
508 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 02:18:22 ] ttp://www.wakhok.ac.jp/~sumi/stl/header/string.html#find ここを見て、stringのメンバ関数findの実装が知りたいと思い、 stringファイルの中を検索してみたんですが見つかりません(環境はVC2008EE)。 find関数は廃止されちゃったんですか?
509 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 02:27:12 ] VC++ならコードを書いて、右クリックの定義へ移動が便利。
510 名前:508 mailto:sage [2008/05/10(土) 02:36:53 ] thx xstringファイルに定義されていました。 インクルードの経路が複雑・・・。
511 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 11:21:32 ] >>482 >ほとんどの台は左第一停止で引き込み100%だったっしょ。(チェリーバーは順押しで引き込み100%) いや、だから「すげー細かい」ってことだったんで・・・ スーパーヘビーメタルについては「リプor緑/リプ/リプ」がJacInなんで引き込み100%かと・・・ www.pachinko-club.com/gallery/kisyu.php?id=603803 ミラクルUFOに関してはわからず・・・ >初BET枚数の異なる2種類ボーナス △ デビルメイクライ3 ロデオ 4種類REGの内、1つが1枚、他は2枚 リオパラダイスがBIG/REGでBET枚数違ったような・・・(リオが3月でDMCが6月)
512 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 12:34:56 ] 業界初スレか。珍しい誤爆だなあ。
513 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:50:42 ] ごめんなさいorz
514 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 19:18:19 ] やっべ何言ってるかさっぱり分からんw うちらも外から見たら同じなんだろうけど
515 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 22:31:28 ] >>514 > うちらも外から見たら同じなんだろうけど むかしガイドライン板に「一度も行ったことない板に行ってみるスレ」ってのがあって、 この板を覗いた奴の感想は「わけわからん。半分ぐらい日本語じゃない」だったなw
516 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 23:07:22 ] マジでまったくわからんなw まぁ、俺はこの板の内容も半分以上わからんが
517 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 02:54:05 ] そういわれるといかにも初心者丸出しな質問でさえ高度に見えてくるぜ
518 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 01:01:43 ] す、すいません・・・ STLをかじり始めの者なのですが、質問があります。 std::ofstreamだのstd::wofstreamだのをいじってみたのですが、 どうしてもユニコードでファイル出力ができません。 std::setlocale("japanese")とやってみると、どうやらshift-jisの テキストが出力されてしまうみたいなんですが・・・。 STLを利用してユニコードのテキストファイルを出力するには どうすればいいのでしょうか?よろしくお願いします。 ちなみにVC9を使用しております。
519 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 01:28:34 ] >>518 ストリームをテキストモードで開いているとUnicodeからANSIへの変換が暗黙のうちに行われます。 バイナリモードで開くとこの変換は行われません。
520 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 02:03:53 ] wchar_tはUTF-16だったりUTF-32だったり処理系定義だということに注意。
521 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 02:08:04 ] >>518 VC限定ならpubsetbufで大丈夫なはず。 msdn.microsoft.com/en-us/library/tzf8k3z8.aspx ただしVCのバージョンによっても挙動が違ったはず。 binaryでも大丈夫になったのかな? 最終手段としてはwchar_t*をchar*に無理やりキャストして書き込むとか。
522 名前:518 mailto:sage [2008/05/13(火) 03:33:12 ] >>519 >>520 >>521 のみなさん、返答ありがとうございました。バイナリで書き込まない といけなかったのですね・・・。>>521 さんの貼り付けてくれたサンプル コードでなんとか分かりました。やっとUTF-16のテキストファイルを 作成することができました。ありがとうございました。
523 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:40:07 ] C#とかの.NET系なら、UTF-16,UTF-8,UTF-32,Shift_JIS,ISO-8859-x,Windows-xxxやら、 システムがサポートする文字コード全て、パラメータ指定するだけで出力出来るんだけどね。
524 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:57:05 ] つlibiconv
525 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:10:11 ] つICU
526 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:18:48 ] つmlang
527 名前:523 mailto:sage [2008/05/13(火) 18:58:21 ] C#とかの.NETなら、標準ライブラリのみで、普段入出力に使用しているクラスに パラメータとして文字コードを追加していするだけでいいんだけどね。
528 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 19:13:27 ] それだけの理由でC#を使えるようならとっくに使っているわ。
529 名前:518 mailto:sage [2008/05/15(木) 21:06:15 ] す、すいません・・・ その後、いろいろと読み漁ってみた結果、上記のままの理解では、 このスレを読んでいる、同じ疑問を持った人に、無用な誤解を与える 恐れがあるかも知れないので、分かったことを書いておきます。 std::fstreamなどのストリームの文字コードの自動変換は std::localeクラスの中にあるファセット(文字セット間の変換、通貨、日付と時刻 などの地域化を司るクラス)と呼ばれる部分で行っているらしいです。 で、文字コード変換を司るファセットはcodecvtと呼ばれており、自分の望んだ 文字コードに変換したい場合は、codecvtの派生クラスを作成するのが、 本来のやり方のようです。で、こんなもんを自分で書くのがよいのか、それとも 既に誰かが書いていて、それを利用できるようになっているのか、というところ までは、まだよく分かっていません。 imt.uni-paderborn.de/download/solaris/Sun_Studio_11/CD1/kits/ide/packages/SPJAhtstd/reloc/SUNWspro/prod/lib/locale/ja/html/manuals/stdlib/user_guide/loc_io/3_2.htm d.hatena.ne.jp/Cryolite/searchdiary?word=*%5BLocale%5D docs.sun.com/source/820-2985/loc_io/19_2.htm 大変お騒がせしました。これにて失礼します・・・。
530 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:15:51 ] Boost.IostreamsがUTF-8のcodecvtを持っていたはず。 一般のライブラリでの実装と言えばそれくらいしか知らないけど。
531 名前:デフォルトの名無しさん [2008/05/21(水) 21:31:09 ] 唐突で申し訳ありませんが、以下、2点質問させてください。 ご意見で結構なので、よろしくお願いします。 @eraseで、listから登録しているクラスのポインタを削除した場合に、 →リストから削除したクラスのデストラクタはコールされる? リストから要素のみ削除されると理解していたのですが、 VC6.0のSTLのドキュメントを読んだところ、 N回のeraseでN回のデストラクタが呼ばれると書いてあったため困惑中。 Aマルチスレッドアプリでコンテナなどを用いるのは危険?(VC6.0を想定) →MSDNにて、eraseを複数のスレッドから同時に実行するとデッドロックする という記載等があったため、少なくともVC6.0のSTLは マルチスレッドアプリを作る上で適当でないと思い始めている段階。 実際、beginなどの引数なし関数コール時にアプリが落ちた経緯あり
532 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:37:54 ] 「listから登録しているクラスのポインタを削除」の意味がワカラン こういう日本語もワカル人がいるので不思議 そういう人を待て
533 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:41:21 ] std::list<T>なら、eraseしたときに該当するオブジェクトのデストラクタが呼ばれる。 std::list<T*>なら、該当するオブジェクトとはlistの要素たるT*のオブジェクトであり、 T自体のデストラクタは呼ばれない。 Tオブジェクトのデストラクタが呼ばれるようにしたければ、 boost::shared_ptrでも使えというのがC++の現状。
534 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:42:41 ] >>531 1. について ポインタ要素を erase してもデストラクタは呼ばれません。 実体を格納している場合には erase でデストラクタが呼ばれます。 2. について 読み取り専用なら安全です。更新があるなら、明示的に排他制御 しましょう。
535 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 00:29:50 ] >>533 534 回答ありがとうございます。 概ね、当方の理解と一致しており、胸を撫で下ろしました。 質問事項Aのマルチスレッドでの使用に関しては、 別スレッドでswap/uniqeなどで iterator iの参照先の内容が変わることを考慮すると、 begin等も容易には使えないですね。 ちなみに、今、他人のソースをレビュー中でして、 人のソースを見ていると、自分の理解が正しいのかどうか ちょっと不安になってきたりと・・・oTL
536 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:10:30 ] >>535 unique後はそもそもイテレータが無効になるから、マルチスレッド以前の問題だね。
537 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:33:51 ] >>535 スレッド安全性については規格では何も規定していないから、実装ごとにドキュメントを 読む必要がある。ドキュメントに記載がなければ、同時アクセスは一切できないものと 考えたほうがいい。そういう実装もあるので、最大限の移植性が必要なら同時アクセスは 一切できないものと考えるべき。
538 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:03:22 ] Intel謹製のスレッドセーフSTLがあったような・・・ あとポインタ格納しつつeraseしてもデストラクトする実装ならboost::ptr_listってのがある
539 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:39:50 ] >>537 自分もそうおもふ
540 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:56:49 ] VC 7.1以降だと文書化されている。 msdn.microsoft.com/en-us/library/c9ceah3b.aspx あるオブジェクトについて、同時読取り可、単一スレッドの書込み可。 同時書込みや読み書き同時は不可。 スレッドごとに別のオブジェクトを読み書きするのは問題ない。 例外的にストリーム出力は同時書込み可。
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 がなぜ必要なのかわかりません。 どこを調べたらいいのでしょうか?