トップページtech
1001コメント287KB

【C++】STL(Standard Template Library)相談室 4

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/10/30(日) 22:51:04
【C++】STL(Standard Template Library)相談室 3
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/

入門ページなど
ttp://www.wakhok.ac.jp/~sumi/stl/
ttp://www.jah.ne.jp/~naoyuki/Writings/STL.html
ttp://e-words.jp/w/STL.html
ttp://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
ttp://www.nantekotta.com/stl.html
ttp://www.s34.co.jp/cpptechdoc/reference/stl_samples/
ttp://www.kab-studio.biz/Programing/STLiostream/
ttp://www.itmedia.co.jp/dict/programming/language/kind/c/01486.html
ttp://ja.wikipedia.org/wiki/Standard_Template_Library
ttp://www.shibu.jp/cppreference/cpp_stl.html
ttp://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html

マルチスレッドプログラミングの時には、
ttp://www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html

STLPort
http://www.sgi.com/tech/stl/
http://www.stlport.org/

関連スレ、その他リンクは >>2-9 ぐらい
0446デフォルトの名無しさん2005/12/17(土) 20:40:22
>>439の実証コードはまだですか?
>>439の正しさが確認されないことには、
議論が進まないのでなるべく早目にお願いします。
0447デフォルトの名無しさん2005/12/17(土) 20:44:06
>>445
多分、3.は必要ないから、無限ループには陥らない。
0448デフォルトの名無しさん2005/12/17(土) 20:55:04
結論としては、nul終端が必要ない時はdata()を使え。ただし義務ではない。
0449デフォルトの名無しさん2005/12/17(土) 20:59:41
data()を使う合理性が確認できない。という限定された結論しか出ていない。
c_str()に対するdata()のパフォーマンス優位性も一切確認されていない。

全ては信者の脳内にしか存在しない。
0450デフォルトの名無しさん2005/12/17(土) 21:07:02
逆にc_str()の方が安全である実装はあるのか?
俺の知っている実装は全て、data()とc_str()は同じものを返すよ。
data()の時も実は'\0'で終端されているという…
0451デフォルトの名無しさん2005/12/17(土) 21:13:43
>>450
size() == 0の時少し振る舞いが違うぞ。
まあ多くの実装で返ってくるものは同じだが(w
0452デフォルトの名無しさん2005/12/17(土) 21:14:32
c_str()のdata()に対する優位性
・ヌル終端保証
・"c_str"というキーワードが他であまり使われないので、文字列検索が"data"に比べて簡単

data()のc_str()に対する優位性
・不明
0453デフォルトの名無しさん2005/12/17(土) 21:15:15
VC++7.1はdata()がc_str()を呼んで、c_str()が_Myptr()を呼んでるよ。
0454デフォルトの名無しさん2005/12/17(土) 21:17:31
>>441
そこでstringstream::str()を引き合いに出してくる理由がわからない。
0455デフォルトの名無しさん2005/12/17(土) 21:19:15
data()のc_str()に対する優位性
・ソース内にc_str()と混在させることにより難読性を高めて、他のプログラマがコピペしにくくする著作権保護効果。
0456デフォルトの名無しさん2005/12/17(土) 21:23:13
>>454
己の経験不足を報告するスレじゃないはずだぞ。
0457デフォルトの名無しさん2005/12/17(土) 21:32:22
stringstream::str()はstd::stringを返すのだからss.str().c_str()という手段はないのか?
0458デフォルトの名無しさん2005/12/17(土) 21:33:10
>>452
> data()のc_str()に対する優位性

Cスタイルの文字列を必要としている局面でないことが明確。
0459デフォルトの名無しさん2005/12/17(土) 21:44:24
問題があるのは、stringstream::str()じゃなくてstrstream::str()だった。スマソ。
0460デフォルトの名無しさん2005/12/18(日) 00:07:21
STL使うとどうなるの?
0461デフォルトの名無しさん2005/12/18(日) 00:12:32
>>460
一気に実行ファイルサイズが10倍になります。
0462デフォルトの名無しさん2005/12/18(日) 00:14:24
>>460
別世界が開ける。
0463デフォルトの名無しさん2005/12/18(日) 00:48:02
>>461
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0464デフォルトの名無しさん2005/12/18(日) 00:57:46
>>461,463
はいはい、他スレのテンプレわろすわろす
0465デフォルトの名無しさん2005/12/18(日) 00:57:49
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0466デフォルトの名無しさん2005/12/18(日) 01:03:05
懐かしいなw
0467not 4632005/12/18(日) 01:03:25
そりゃそうでしょ。
「実行ファイルのサイズが10倍になる」を受けてるレスだから。
0468デフォルトの名無しさん2005/12/18(日) 01:12:09
http://www.google.com/search?q=%22-D_RTLDLL+%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%22+%22%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%97%E3%81%A8%E3%81%84%E3%81%A6%22&num=50&hl=ja&lr=&filter=0
0469デフォルトの名無しさん2005/12/18(日) 01:30:19
>>468
ワロスwwwww
0470デフォルトの名無しさん2005/12/18(日) 01:36:26
懐かしさと共にワロスwwww
0471デフォルトの名無しさん2005/12/18(日) 01:45:39
自作自演乙
0472デフォルトの名無しさん2005/12/18(日) 02:03:26
>>471 がどれを自作自演と言いたいのか判らない。
0473デフォルトの名無しさん2005/12/18(日) 05:32:51
だってこのスレに書き込んでるの俺一人しかいないしw
0474デフォルトの名無しさん2005/12/18(日) 07:27:07
いつも思うのだが、>>463は正しいことを書いてる。
あの時点で注目されているのはテンプレートのコード生成に伴うサイズ増量であって、
Cランタイムがどのようにリンクされようがテンプレートと何の関係もない。
むしろ動的リンクの方がテンプレートによる増量がわかりやすいかもしれない。
0475デフォルトの名無しさん2005/12/18(日) 07:31:10
           i::::::::/'" ̄ ̄ヾi
           |:::::::| ,,,,,_  ,,,,,,|
           |r-==( 。);( 。)
           ( ヽ  :::__)..:: }
        ,____/ヽ  ー== ;  ほほう それでそれで?
     r'"ヽ   t、   \___ !
    / 、、i    ヽ__,,/
    / ヽノ  j ,   j |ヽ 
    |⌒`'、__ / /   /r  |
    {     ̄''ー-、,,_,ヘ^ |
    ゝ-,,,_____)--、j
    /  \__       /
    |      "'ー‐‐---''
0476デフォルトの名無しさん2005/12/18(日) 07:48:26
std::string使ってないなあ
MBSやsurrogateやらの対応が甘そうだったので自前で作った
0477デフォルトの名無しさん2005/12/18(日) 08:06:26
std::stringから継承するという選択肢は無視かね。
MBS対応メソッドを追加すればすむだけなのに。
0478デフォルトの名無しさん2005/12/18(日) 09:40:48
std::stringから派生するのはやめた方が……。
非仮想デストラクタだし、スライスも怖いし……。
0479デフォルトの名無しさん2005/12/18(日) 10:03:16
>>478
非仮想デストラクタの心配は杞憂。

別のスコープで作られた派生クラスインスタンスを
基底クラスのポインタで破棄すべき状況が、
果たして文字列クラスで起こりうるかどうか考えよう。
ポインタを使いたくないからクラス化しているのに本末転倒な状況だ。

また、STLのコンテナやアルゴリズムがテンプレートを用いており、
継承をあえて使っていない理由についても考えよう。


ところで、「スライス」とは何?
0480デフォルトの名無しさん2005/12/18(日) 11:36:17
>>479
基底クラスへのスライシングだろ。
非仮想デストラクタの場合と心配してるところの根は同じだと思う。
0481デフォルトの名無しさん2005/12/18(日) 11:40:33
>>479
> ポインタを使いたくないからクラス化しているのに本末転倒な状況だ。

そんなあほな。
0482デフォルトの名無しさん2005/12/18(日) 11:58:05
>>480
スライスが動詞でスライシングが動名詞だということだけはわかりました。本当にありがとうございました。

>>481
そういうもんですか?
自分でバッファを確保・解放するなら、
文字列クラスじゃなくて生のchar*でいい気がするけど、どうでしょうか。
暗黙のうちに解放されるコンテナの場合、>>479が触れているとおりテンプレートだし。
だめ?
0483デフォルトの名無しさん2005/12/18(日) 12:40:10
スライシングすらわからんのなら出直してこい
0484デフォルトの名無しさん2005/12/18(日) 12:46:34
>>476
std::wstringは?

>>477
char_traitsの自作は?
0485デフォルトの名無しさん2005/12/18(日) 14:40:45
オススメはbasic_string<unsigned char>でUTF-8

いや、マジで。
0486デフォルトの名無しさん2005/12/18(日) 14:55:54
1文字進めるとかは?
0487デフォルトの名無しさん2005/12/18(日) 15:01:58
>>484
>std::wstringは?
ワイド文字列の罠
ttp://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
0488デフォルトの名無しさん2005/12/18(日) 15:34:13
Windows上で多言語対応が必要ないなら16bit化SJISをwstringにつっこむのが最強。
0489デフォルトの名無しさん2005/12/18(日) 18:40:23
>>488
それAPIやライブラリ関数呼び出しの度にchar*またはwchar_t*に
変換せなあかんのか
最悪じゃん
0490デフォルトの名無しさん2005/12/18(日) 19:28:16
>>488
UTF-16をwstringに格納することに比べどんな利点があるのか?
0491デフォルトの名無しさん2005/12/18(日) 21:56:36
1文字進めるのが簡単
0492デフォルトの名無しさん2005/12/18(日) 22:04:08
そして2文字戻す。
0493デフォルトの名無しさん2005/12/18(日) 22:51:03
三歩進んで二歩下がる
0494デフォルトの名無しさん2005/12/19(月) 09:49:59
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん
0495デフォルトの名無しさん2005/12/19(月) 10:12:46
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん
0496デフォルトの名無しさん2005/12/19(月) 11:18:52
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん
0497デフォルトの名無しさん2005/12/20(火) 21:18:46
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん
0498デフォルトの名無しさん2005/12/20(火) 21:37:00
>>479
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、
> 継承をあえて使っていない理由についても考えよう。

(゚Д゚)ハァ?
テンプレート関係ないやん
0499デフォルトの名無しさん2005/12/20(火) 22:42:51
>>479 
> また、STLのコンテナやアルゴリズムがテンプレートを用いており、 
> 継承をあえて使っていない理由についても考えよう。 

(゚Д゚)ハァ? 
テンプレート関係ないやん 
0500デフォルトの名無しさん2005/12/20(火) 23:23:51
よくわからん流れだが
500は頂いとくよ
0501デフォルトの名無しさん2005/12/20(火) 23:26:28
ショック!自作ゲームでわざわざタスクシステムを自前リストで作ってたけど、
STL使ったら直ぐに出来上がった。
今まで食わず嫌いしてて損したよママン。
0502デフォルトの名無しさん2005/12/20(火) 23:47:06
まあまあ、苦労は一回はいいんでないかい。一回だけね。
0503デフォルトの名無しさん2005/12/20(火) 23:59:43
ゲームのタスクシステムに向いてるのってsetとlistどっちでしょうか?
0504デフォルトの名無しさん2005/12/21(水) 00:08:58
普通は組み合わせることになるんじゃないの?

mapのlistとか、vectorのmapとか。
setはあんまり出番なさそうだけど。
0505デフォルトの名無しさん2005/12/21(水) 00:10:53
priority_queueだと思うが。
05065012005/12/21(水) 00:16:04
俺はlistで作ってみた。で、タスクは一定のメモリを使い回すのが利点なので、動的メモリ確保開放しないように作りたい。
で、結局push_frontでダミーを一定量確保したら一旦clearするようにタスクのファクトリを作ってみた。

push_back等で一定量確保した後で、eraseやclearを使った後は、前に確保した領域は使い回されている保障はあるのかな。
誰か詳細キボン。
0507デフォルトの名無しさん2005/12/21(水) 00:18:58
そういう場合のためにアロケータがあるんだけどな。
05085012005/12/21(水) 00:21:48
>>507
なるほど偉い便利だな。これで心置きなく作れる。
サンクス。
0509デフォルトの名無しさん2005/12/21(水) 00:31:08
>506
そういうのはvectorだけじゃね?
reserve()があるのはvectorだけだし。
0510デフォルトの名無しさん2005/12/21(水) 01:18:42
するとvectorのarg2に自前のアロケータテンプレート指定して作れって事ですかね。
安心できると思ったけど結構めんどいね。
0511デフォルトの名無しさん2005/12/21(水) 01:34:11
>510
reserve()はアロケータの呼び出し自体を抑えて、動的メモリの再確保回数を減らす方法。
listで似たような事をしたければ自前アロケータの内部で似たようなことをするように作れ、と言うこと。
0512デフォルトの名無しさん2005/12/21(水) 04:40:22
boost::poolをコンテナの第三引数に入れて、ベンチマークを取ったり
した。ケースバイケースだけど、こちらの方がわずかに速くなる場合がある。

逆に遅くなる事もある。環境や用途にも大きく左右されると思うので、
各自実験してみて欲しいが、なかなか面白いる
0513デフォルトの名無しさん2005/12/21(水) 05:02:50
>面白いる
いらん
0514デフォルトの名無しさん2005/12/21(水) 05:11:03
かなタイプで、「。」を「る」に打ち間違えただけじゃないかー
そんなに責めるなよーorz
0515デフォルトの名無しさん2005/12/21(水) 07:04:20
>>510
作らないでもいろいろある。
0516デフォルトの名無しさん2005/12/21(水) 13:55:28
>>515
それを聞きたいいる
0517デフォルトの名無しさん2005/12/21(水) 15:08:20
STLを学ぼうとして最初に思い込みが原因か疑問符がついたので質問させてください。
string型なのですが、char型配列→string型はもちろんできます。
逆も「読み取り専用」なら str.c_str(); で出来たのですが、string型に直接値を入れるのはできないのでしょうか。(設計思想的にできないのかなと思ってます)

例えば
strcpy(str.hoge(), "こんにちは");
なんて真似です。
作ってるアプリケーションでGetOpenFileNameを使っているのですが、
一旦char配列にファイルパスを受け取らせ、その後pathを保存しておくためのstring型に変換するべきなのでしょうか。
0518デフォルトの名無しさん2005/12/21(水) 16:37:52
よくわからないけど、
std::string hoge;
hoge = "こんにちは"
ならできるよ?
0519デフォルトの名無しさん2005/12/21(水) 16:44:07
お返事ありがとうございます。

それは = 代入演算子が使われているからですよね。
それではなく
sprintf(str.c_str(), "%d", 5);
などが出来ないかなと思いまして。

↑これ自体はやっちゃいけないらしいですけど、他でこの想定にかなう方法はあるのかなと。
Win32APIなどでは、char*を引数で渡して中身を入れてもらうAPIも多くあるので…。
0520デフォルトの名無しさん2005/12/21(水) 16:48:31
要はstrcpy()とかsprintf()とかfgets()のような振る舞いをする関数で使いたいと言うことだろ。
ポインタを渡してそこに書いてくれるような。
05215202005/12/21(水) 16:49:51
がーん、リロードすべきだったw

で、WinAPIを使いたいだけならCStringという妥協でも委員でないの?
0522デフォルトの名無しさん2005/12/21(水) 17:41:27
STLのstringはそういう扱いはできないということですね。
ありがとうございました。
0523デフォルトの名無しさん2005/12/21(水) 18:08:18
stdio系使わずにstringstream使え
0524デフォルトの名無しさん2005/12/21(水) 18:42:47
sprintf -> stringstream
fgets -> getline

とか、代替のものがあるので、それを使うのが一番じゃないかな。
0525デフォルトの名無しさん2005/12/21(水) 18:59:21
>523>524
WinAPIで使いたい、って書いてあるやん。
0526デフォルトの名無しさん2005/12/21(水) 20:03:24
std::string strprintf(const char *fmt, ...)
みたいな関数をでっち上げればいい。
0527デフォルトの名無しさん2005/12/21(水) 20:27:50
んなことやるぐらいならboost::formatで。
0528デフォルトの名無しさん2005/12/21(水) 20:29:26
boostは使いたくない
0529デフォルトの名無しさん2005/12/21(水) 21:17:49
>>528 その心は?
0530デフォルトの名無しさん2005/12/21(水) 21:21:00
>>519
WinAPI相手ならstd::vector<TCHAR>で我慢してくれ。
0531デフォルトの名無しさん2005/12/21(水) 21:46:12
>>529サイズがでかくなるから
0532デフォルトの名無しさん2005/12/21(水) 21:50:43
環境によるだろ。
俺は(略)
0533デフォルトの名無しさん2005/12/21(水) 21:57:57
すげえ。ダイナm(略)
0534デフォルトの名無しさん2005/12/21(水) 23:27:46
#include <stdafx.h>

後(略)
0535デフォルトの名無しさん2005/12/21(水) 23:34:43
>>517
望みは捨てるな。
http://pc8.2ch.net/test/read.cgi/tech/1133007604/469-470n

469デフォルトの名無しさん2005/12/21(水) 06:05:51
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-12-19: The 2005-12 mailing is available (1600 kb tar.gz, .zip 1600 kb) individual papers
News 2005-12-17: The C++ Standard Library Issues List (Revision 40) is available (.tar.gz)
News 2005-12-17: C++ Standard Core Language Issues List (Revision 39) is available, also committee version

470デフォルトの名無しさんsage2005/12/21(水) 10:29:39
うげっ、std::string<>もメモリ上の連続性を仮定するようになるのかよ。
0536http://pc8.2ch.net/test/read.cgi/tech/1133007604/4702005/12/22(木) 02:30:13
>>535
恥ずかしいから貼らないでくれorz
0537デフォルトの名無しさん2005/12/22(木) 02:39:38
std::string hage="ビャーネ";
hage[0] = 'ウ';

いまでもこれならできたりする。
0538デフォルトの名無しさん2005/12/22(木) 02:53:20
うむふ
0539デフォルトの名無しさん2005/12/22(木) 10:17:18
>>535
いやっほーう!
0540デフォルトの名無しさん2005/12/22(木) 10:35:35
>>535
> 530. Must elements of a string be contiguous?
> (中略)
> The characters in a string are stored contiguously, meaning that if
> s is a basic_string<charT, Allocator>, then
> it obeys the identity
> &*(s.begin() + n) == &*s.begin() + n
> for all 0 <= n < s.size().

か。
0541デフォルトの名無しさん2005/12/23(金) 00:19:34
http://tricklib.com/cxx/dagger/xstring.h

std::string location;
sprintf(capture_string(&location), "<%s>#%d", __FILE__, __LINE__);
0542デフォルトの名無しさん2005/12/23(金) 05:38:16
>>541 突然なんだ?
0543デフォルトの名無しさん2005/12/23(金) 14:25:28
>>542

ちょっとタイミング外したけど、>>519 に対してのレス。
0544デフォルトの名無しさん2005/12/23(金) 18:14:09
dequeがサイズ拡大時に確保するメモリブロックのサイズって大体どれくらいなのでしょうか?
0545デフォルトの名無しさん2005/12/23(金) 18:17:10
処理系による。
■ このスレッドは過去ログ倉庫に格納されています