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

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

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

関連スレなどは>>2以降で
0552デフォルトの名無しさん2005/05/04(水) 23:03:02
>>549
STL の意味を知らないからこそこのスレに来るんじゃなかろうかと。
0553デフォルトの名無しさん2005/05/04(水) 23:18:27
>>535
"標準的"手法
#include <iostream>
#include <sstream>

int main()
{
    double d = 1.2345;
    std::stringstream ss;
    std::string str;
    ss << d;
    ss >> str;
    std::cout << str;
}
0554デフォルトの名無しさん2005/05/05(木) 00:14:19
>>552
orzとSTL
0555デフォルトの名無しさん2005/05/05(木) 00:15:12
>>552
そうなんだけど。
だからこのスレいらないんだよ。
0556デフォルトの名無しさん2005/05/05(木) 00:19:15
無かったらまたどっかのアフォが立てるだけ
例えば俺とか
05575522005/05/05(木) 00:39:38
>>553
ほらね。
0558デフォルトの名無しさん2005/05/05(木) 00:44:21
”標準的”って書いてあるやん
0559デフォルトの名無しさん2005/05/05(木) 02:38:55
>>558
STLちゃうやん
0560553じゃないけど2005/05/05(木) 02:43:09
>>559
だから”標準的”なんでしょ。
stringもstreamもSTLではないが標準ライブラリに含まれる。
0561デフォルトの名無しさん2005/05/05(木) 02:53:46
じゃあSTLとSLの違いを教えてください
0562デフォルトの名無しさん2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。

このスレが不要である事に疑いの余地は無い。
0563デフォルトの名無しさん2005/05/05(木) 03:08:02
それが結論でいいんだけど、書籍や入門サイトでSTLの呼称が
根強く残っているから混乱しちゃうんだな。
呼称は「標準ライブラリ」で統一されるといいんだけど。
0564デフォルトの名無しさん2005/05/05(木) 03:17:35
563
標準ライブラリじゃなくてテンプレートライブラリ
0565デフォルトの名無しさん2005/05/05(木) 03:29:05
テンプレートが邪魔だって言ってるんでは
0566デフォルトの名無しさん2005/05/05(木) 06:39:30
orzとSTLの違いを教えてください
0567デフォルトの名無しさん2005/05/05(木) 07:05:53
vectorは配列に比べて動作が遅くなりますか?
0568デフォルトの名無しさん2005/05/05(木) 07:19:56
テメーで計ればすむことだろ
0569デフォルトの名無しさん2005/05/05(木) 07:30:48
>>568
はかってみたら5倍程度遅くなったんです。これってふつうですか?
0570デフォルトの名無しさん2005/05/05(木) 07:53:23
その値が普通かどうかは知らないが、サイズやキャパシティを自分で覚えてくれて
アクセス毎に境界チェックが入るということ等から見当がつきそうなものだが。

見当がつかなかったらコンパイラにアセンブラソースを吐かせて自分で比較すれ。
0571デフォルトの名無しさん2005/05/05(木) 08:39:12
だが断る
0572デフォルトの名無しさん2005/05/05(木) 09:00:21
>>567>>569
速度が気になるのならboost::arrayをどうぞ。
0573デフォルトの名無しさん2005/05/05(木) 09:02:38
>>569
普通に全件表示を書いたら配列とvectorでは速度が変わらなかったんです。
普通にstd::find()を使ってもstd::accumurate()を使っても同じ速度だし。
どうやったらvectorを遅く動かせるんでしょうか。
0574デフォルトの名無しさん2005/05/05(木) 09:07:12
>>573
vectorは動的にメモリを確保するから、普通の配列に比べコンストラクタ・デストラクタに時間が掛かる。
0575デフォルトの名無しさん2005/05/05(木) 10:45:10
なので、はじめにあらかじめ確保する関数があったはず。
0576デフォルトの名無しさん2005/05/05(木) 10:48:22
>>575
それでも普通の配列より時間がかかる
0577デフォルトの名無しさん2005/05/05(木) 11:23:36
>>570
operator[]()は境界チェックをしないわけだが。
0578デフォルトの名無しさん2005/05/05(木) 11:28:29
>>576
デバッグモードだと差がでるけど、リリースモードだとかなり差が縮んだはず。
まあ、俺的には可変長という汎用性の割には満足な結果だと思うがどうよ?
0579デフォルトの名無しさん2005/05/05(木) 13:29:55
つーか、リリースモードとやらが何かよく判らんが、普通に最適化していれば>573の条件だと実質差がないはず。
保守性考えてもvectorでしょ。
#あ、boost::arrayは知らないのだが、vectorに較べてよりよいならそれも検討の価値ありだな。
0580デフォルトの名無しさん2005/05/05(木) 14:00:52
リリースモードとかデバッグモードとかいっちゃてるやつは
オープンソースの敵
0581デフォルトの名無しさん2005/05/05(木) 14:09:49
・静的な配列
・スタック上の固定配列
・_alloca等でスタック上に確保される配列
・ヒープに確保される配列
には多少差があるだろ。ついでにvectorの場合要素の初期化コストもかかる。
0582デフォルトの名無しさん2005/05/05(木) 15:32:31
・性的な配列
・スタック上の固定配合
0583デフォルトの名無しさん2005/05/05(木) 16:15:32
auto_ptrを使ったimplとかクラス内の作業用メモリ確保で、
たとえば auto_ptr< vector<T> > impl; ← こんな感じでvectorとかdequeとか、
動的にサイズ変化するようなもんをauto_ptrに突っ込んでも大丈夫なんだろうか?
なんかとても不安なんだが。auto_prtとSTLは相性悪いし。

↓例

class hoge
{
auto_ptr< vector<string> > impl;
public:
hoge() : impl ( new vector<string>(0))
{}
void push(const string& str)
{ impl->push_back(str);}
string& back()
{ return impl->back();}
string& front()
{ return *(impl->begin());}
};


int main()
{
hoge x;
x.push("aaaaa");
x.push("bbbbb");
cout << x.front();
x.back() = "ccccc";
cout << x.back();
}
0584デフォルトの名無しさん2005/05/05(木) 16:27:03
>>583
それは構わない。逆がまずいだけで。
0585デフォルトの名無しさん2005/05/05(木) 16:39:25
でもまぁ現実的には、「implとかクラス内の作業用メモリ確保」のために
「動的にサイズ変化するようなもん」を「auto_ptrに突っ込」むのは
あんま意味無いよな。
0586デフォルトの名無しさん2005/05/05(木) 17:15:06
>>584
STLコンテナのは有名だけど、おかげでググったらauto_ptrは最悪とか書かれてて
最近まで使うの躊躇してもんで。

>>585
ムッキッー 上の例はimplのほうじゃ!謝罪と(ry
(たぶん正確にはpimplだけどな)
0587デフォルトの名無しさん2005/05/05(木) 17:23:38
所有権を移動させるつもりのないpimplで、
さらに指してるのがvectorならauto_ptrは別に使わなくて良いような?
0588デフォルトの名無しさん2005/05/05(木) 17:24:30
auto_ptrは便利だと思うけどな。
exceptional c++でも読んでみ?便利な使い方のってるよ。

結局、標準のスマートポインタがauto_ptrっていう
割と癖の強いスマートポインタしかないのがダメなだけ。
普通のスマートポインタが必要な人にとっては
「何だこれは?」みたいなことになる。
0589デフォルトの名無しさん2005/05/05(木) 17:36:51
>>588
万人に理解されない設計をするなってマジで思う。
0590デフォルトの名無しさん2005/05/05(木) 17:47:16
だが断る
0591デフォルトの名無しさん2005/05/05(木) 17:54:55
>>587
実際ところは↓こんな感じでつかってるんで、vectorを直接渡すってわけじゃないけど。
大丈夫か気になったんでちょっと聞きたかっただけ、今は反省している。

struct A{
string class;
set<string> name;
};

auto_ptr<A> impl;
0592デフォルトの名無しさん2005/05/05(木) 18:00:31
書いたときそれが人に理解しやすいか
どうかってのを考えないでやたらめったらテンプレート使う
クソグラマが多くなったね。
ソースコードに技巧をこらしちゃうとホントに見れたもんじゃない。
やねうらおまわりの奴等のソースは汚いだけ。
でもって動作最悪w
せめて技巧をこらしたなら動作はよくしろよって思うw

ひとりごとね。レスつけないで。
0593デフォルトの名無しさん2005/05/05(木) 18:06:31
だが断る
0594デフォルトの名無しさん2005/05/05(木) 18:13:15
>>592
レスつけられるの怖がっちゃうような、
小動物並みの心臓しか持ってない癖に2chに書き込むな。

メモ帳にでも書いとけバーカ。
0595デフォルトの名無しさん2005/05/05(木) 18:14:13
>>589
不勉強な人に理解されないのはしょうがないと思う。
ある程度 C++ を理解している人で auto_ptr がわからない
なんていう人は今のところ見たことがない。
0596デフォルトの名無しさん2005/05/05(木) 18:24:57
>>595
>ある程度 C++ を理解している人で auto_ptr がわからないなんていう人は今のところ見たことがない。
俺のいる会社の同僚が全滅な件について
0597デフォルトの名無しさん2005/05/05(木) 18:28:18
>>595は「std::auto_ptr<>も理解できない奴はC++をまともに勉強していない」と言いたいんちゃうか。
0598デフォルトの名無しさん2005/05/05(木) 18:29:44
そりゃ少しでもC++やってりゃauto_ptrくらいは知ってる罠
0599デフォルトの名無しさん2005/05/05(木) 18:35:03
>>597-598,595
俺のいる会社の同僚も全滅な件について
0600デフォルトの名無しさん2005/05/05(木) 18:47:44
俺自身が全滅な件について
0601デフォルトの名無しさん2005/05/05(木) 18:52:10
std::auto_ptr を理解した上で、マンドクセーので boost::shared_ptr を使っても良いのかどうかについて
0602デフォルトの名無しさん2005/05/05(木) 18:56:35
>>601
boostがスレちがいな件について
0603デフォルトの名無しさん2005/05/05(木) 19:00:39
しかしコンテナの要素にauto_ptrを使おうとすると「boost::_shared_ptr使え」といわれる件について。
0604デフォルトの名無しさん2005/05/05(木) 19:04:23
>>603
テンプレートに技巧を凝らしてしまう愚かな奴について
0605デフォルトの名無しさん2005/05/05(木) 19:12:56
>>604
boost::mplくらいでないとテンプレートに技巧凝らしてるとはいえない件について
0606デフォルトの名無しさん2005/05/05(木) 19:14:15
>>605
boostなんてほとんどの奴は使ってない件について
0607デフォルトの名無しさん2005/05/05(木) 19:14:29
俺の息子がここ1ヶ月で2cm伸びた件について
0608デフォルトの名無しさん2005/05/05(木) 19:19:02
ムチで申し訳ないんだけど、Template の概念って何処から取り入れたの?
C++ 独自の機能ではないよね?
0609デフォルトの名無しさん2005/05/05(木) 19:48:33
>>608
禿曰くAdaとCluから影響を受けたそうだが。あとはCのプリプロセッサマクロの安全な代替。
0610デフォルトの名無しさん2005/05/05(木) 22:13:29
>>609
thanx!!
Clu というのは恥ずかしながら知りませんでした。面白そうね。

http://www.shoeisha.com/book/pc/20c/chap08/gen.htm
0611デフォルトの名無しさん2005/05/05(木) 23:00:45
>>607
皮が?
0612デフォルトの名無しさん2005/05/06(金) 06:37:30
肉が
0613デフォルトの名無しさん2005/05/06(金) 07:21:55
ほとんどAdaのgenericのパクりだ
templateの方が、より強力でより便利な反面
圧倒的に危険な仕様であるが
0614デフォルトの名無しさん2005/05/06(金) 07:37:45
特殊化ってのがキュート。
再帰展開が強欲。
0615デフォルトの名無しさん2005/05/06(金) 17:31:07
boost::shared_ptr や、boost::function、boost::bind なんかもそのうち標準になるし、
今のうちからなれておく意味で使っておくのは悪くないと思うの。
0616デフォルトの名無しさん2005/05/06(金) 21:38:53
>>615
俺の設計理念ではboostとかスマートポインタなんか必要になる時点で駄目。
普通の人の理解の限界はvectorとlistとstringまで。
と、俺は思ってる(その他のSTLってどうも気持ち悪い)。
0617デフォルトの名無しさん2005/05/06(金) 21:46:17
誰もオマエの設計理念なぞ聞いておらん
0618デフォルトの名無しさん2005/05/06(金) 22:10:46
>>617
スマートポインタなんてどこで使うんだよ!ってきくと
大抵、ウンコな設計してるからみちゃいられん。

テンプレートは特に必要が無いなら、なるべくさけるようにして
設計技術を磨いてったほうがいいよ。

と、あえてテンプレートスレでいってみる。
なるべく多くの人に理解できる使い方を心がけよう。>ALL
0619デフォルトの名無しさん2005/05/06(金) 22:11:18
聞いていなくてもレスは付くもの。

そんな常識もわからんのかw
0620デフォルトの名無しさん2005/05/06(金) 22:14:20
普通の人の限界は…って、自分を普通だと思いたいんだろうけど、普通の人を馬鹿にしてないかw
スマートポインタぐらい使えるだろw
0621デフォルトの名無しさん2005/05/06(金) 22:16:35
>>618
>あえてテンプレートスレでいってみる。
誤りですね。ここはテンプレートスレではありません。STL スレです。
…って何回言や理解すんだろな。
0622デフォルトの名無しさん2005/05/06(金) 22:18:18
スマートポインタなしで、どうメモリ管理をするのかしらん
GCを使うのを除けば、ろくな方式を知らんが
0623デフォルトの名無しさん2005/05/06(金) 22:24:03
>>616
是非スマートポインタを使わない際のメモリ動的取得解放の
設計を書いていただけないだろうか。
良いか駄目かということよりも、どうやれば良いのかということの
方が興味あるのです。
0624デフォルトの名無しさん2005/05/06(金) 22:36:10
>>616
boost::functionは使わないより使ったほうが分かりやすくなると思うけど。
0625デフォルトの名無しさん2005/05/06(金) 22:42:10
C++でvoidってvoid*以外はめったに使わないから、
boost::functionで引数なしの型をどう書くのかしばらくわからなかった。
0626デフォルトの名無しさん2005/05/06(金) 22:50:40
なんでSTLじゃなくてboost使ってるのかを簡潔に述べてください
流行だからは無しで。なんとなくも無し。
0627デフォルトの名無しさん2005/05/06(金) 22:57:21
>なんでSTLじゃなくてboost使ってるのか
だからなぜそんな2者択一な質問になるのだ?
STLにはない機能が、もしくはSTLにも同様な機能があるがより拡張・洗練された形で
Boostで提供されているから使っている、それが理由だ。
0628デフォルトの名無しさん2005/05/06(金) 22:58:59
>>623
方法とかそういうのは無い。
決まりを守るだけ。

・必ず確保したクラスで解放するようにする。
・そのメモリにアクセスできるのは確保したクラスのみ。
・確保したクラスを消せば消滅する。
・そのメモリへのポインタの保持を許さない。

ってだけ。
同じようなことをやるのにdelete時のメモリの解放忘れ防止ただそれだけのために
スマートポインタを使うのなら俺もいいとおもうのだけどね。
どうもそれだけじゃない人を見て、それが気持ち悪くてね。
0629デフォルトの名無しさん2005/05/06(金) 23:02:21
http://p3021-ipad402marunouchi.tokyo.ocn.ne.jp/
おkwwwっうぇっうぇうぇwwwうぇwww
wwwwww
wwwうはっwwwっwwwwwwっ
wおkwww

wおkwwwおkwww
おkwwwwwwwww
0630デフォルトの名無しさん2005/05/06(金) 23:11:22
>>628
>・必ず確保したクラスで解放するようにする。
>・そのメモリにアクセスできるのは確保したクラスのみ。
>・確保したクラスを消せば消滅する。
>・そのメモリへのポインタの保持を許さない。

こんな不自由な決まりを作らないとダメな時点でダメだろw
0631デフォルトの名無しさん2005/05/06(金) 23:22:28
>>625
戻り値なしのときはどうしているの?
0632デフォルトの名無しさん2005/05/06(金) 23:24:13
>>631
忘れてた。
0633デフォルトの名無しさん2005/05/06(金) 23:27:59
「俺の設計理念ではboostとかスマートポインタなんか必要になる時点で駄目」
とか言ってる時点で駄目。

「スマートポインタなんてどこで使うんだよ!ってきくと
大抵、ウンコな設計してるからみちゃいられん」
と言ってるヤツは大抵ウンコな設計してるから見てられん。
06346232005/05/06(金) 23:32:23
>>628
返事ありがとう。
つまり、scopedに解放されることを重視していると思って良いですか?
>>628の気持ち悪いのは複数のオブジェクトに共有されて、
いつが解放のタイミングかわからない状態のことだと感じました。

少なくともboost::scoped_ptrは許容されているように見えます。
0635デフォルトの名無しさん2005/05/06(金) 23:33:02
>どうもそれだけじゃない人を見て、それが気持ち悪くてね。

例えば、どんな?
06366232005/05/06(金) 23:41:25
>>628
次に、>>634の前提で書くと、MicrosoftのCOMなどに対する考え方を
どの様に持っておられるか気になります。COMは参照カウントを内部に
持つことで、解放のタイミングが掴めません。逆に言えば、利用者がいなくなった
時点で自動的に解放されるとも取ることができます。

これに対しては気持ち悪いと思われますか?
良い、駄目、またその理由なども伺ってみたいです。
0637デフォルトの名無しさん2005/05/06(金) 23:46:51
「俺の設計理念ではboostとかスマートポインタなんか必要になる時点で駄目」
auto_ptrもダメですか。そうですか。
0638デフォルトの名無しさん2005/05/06(金) 23:53:08
物に対して問答無用でダメと言う時点でダメ
と言うことは、私もダメ…
0639デフォルトの名無しさん2005/05/07(土) 00:12:05
>636
むしろCOMのようなフレームワークの存在を前提におけば
それだけでshared_ptrの有用性は十分認められると思うんですけれどね.
実際COMオブジェクトとshared_ptrの組み合わせはshared_ptrの代表的な使用例になりえますし.

>628
scopedな使用例にしかスマートポインタの必要性を認めてないですけれど,
factoryなどで関数境界,あるいはバイナリ境界を所有権が超える必要性って
普通にあると思うんですが,ここら辺ってどうなんでしょうか.

後,CoW(あるいはpimplの一部)には普通に所有権の共有がありえますし,
またslot,observerのようにオブジェクトを登録するようなパターンでは
どのようにすれば良いのかも聞いてみたい.
0640デフォルトの名無しさん2005/05/07(土) 00:25:19
>>636
てゆうか、参照カウンタによっかかって
プログラム組んでくとソース中にばら撒いた一見なんの関連もないようで
実はちゃっかりつながってるオブジェクトに酷い目にあわされるでしょ?

参照カウンタが役に立った極稀な例は俺のプログラミング人生で
ゲームのりソース管理ぐらいだ。
データのロードとアンロードをするとき。
まあ、こういう変なことするときって大抵最適化とかそっちまわりだよね。
十分に速度がありゃ、1回すべて破棄して、構築しなおす。これ最強。
綺麗な設計が重視されるときはこれが一番。
0641デフォルトの名無しさん2005/05/07(土) 00:31:21
所有権の共有が必要ないソフトウェアしか書かない人も居る。
所有権の共有が当然なソフトウェアしか書かない人も居る。
両方を書く人も居る。

大事なのは自分の環境が一般的ではない可能性を想定できることだ。
顔も知らない他人と話すのに「普通は」なんて、そう簡単に持ち出すべきではない。
06426232005/05/07(土) 00:32:20
>>639
返事ありがとう。
>>636の俺の意図は>>628のレスの意図を明確化したいがためなんです。
どこに駄目さとか気持ち悪さを感じているのかを得たいと思ったんですよ。
でも、同じような目線でレスしてくれる人が居て助かります。
0643デフォルトの名無しさん2005/05/07(土) 00:42:44
>参照カウンタが役に立った極稀な例は俺のプログラミング人生で

お前のプログラム人生って
単純なショボイプログラムしか作ったことない、そんな人生なんだろうね。
06446392005/05/07(土) 00:44:34
>>641
まったくもっておっしゃるとおりです.639のレス中の「普通は」という言葉は不適切でした.すいません.
639は「639に書いたような設計も十分想定され,そのような設計では所有権の共有あるいは
shared_ptrも十分有用だと思うので,一概にそれを否定するのには違和感を感じます.」
というふうに訂正させてください.

>642
>どこに駄目さとか気持ち悪さを感じているのかを得たい
それは私も同じです.
0645デフォルトの名無しさん2005/05/07(土) 00:48:49
>>639
COMって、 IUnknown で AddRef() が定義されてるんだから、 intrusive_ptr のほうが適切じゃないの。
06466232005/05/07(土) 00:54:28
>>640
まだ酷い目に遭った事はありませんが、デッドロックが話題になったりしますね。
つまり参照カウンタに良い印象を持たれていないということなんですね。

参照カウンタ型の管理が必要になるのが効率アップの為が多いというのも
同意できます。この方式を利用するのはオブジェクトの生成から破棄
までの時間を限りなく短くするため(もしくはそのタイミングが決められない場合)
だろう考えるからです。
# 標準ライブラリのコンテナに入れるためというのは本質的ではないのでここでは無視

ここまでレスを続けると、>>628は言葉がまずいだけでそれほど的外れでは無いと
思っています。
0647デフォルトの名無しさん2005/05/07(土) 00:58:29
フッ、まあ、最後に言わせてくれ。
俺の文章とお前等の文章どっちが読みやすいかわかるか?
俺のは>>628,640でお前等のは>>634,636,639だ。
俺は俺が認識する普通のプログラマが普通にもっている知識で十分に読める文章で書いたつもりだ。
お前等の文章はどうかな?w
俺が難くなに守っているものはソース可読性でも設計理念でも無い。

俺が持つ普通という感覚の普通らしさだ。
まあ、scopedなfactoryでpimplがsharedな会話をしてるお前等にはきっとわからんだろうがなw
06486232005/05/07(土) 01:02:14
>>628ははっきり言及はしていないですがstd::auto_ptr、boost::scoped_ptr
に関しては許容しているようです。

さらに>>639にある
>scopedな使用例にしかスマートポインタの必要性を認めてないですけれど,
>factoryなどで関数境界,あるいはバイナリ境界を所有権が超える必要性って
>普通にあると思うんですが,ここら辺ってどうなんでしょうか.
これらの利用法は恐らく彼の許容範囲内では?
違っているなら否定して欲しいところです。

ではboost::shared_ptrをどのように利用するのかというところが
最も中心的な内容だと感じています。続きを書きたいですがここで切ります。
0649デフォルトの名無しさん2005/05/07(土) 01:03:54
>>647
なにコイツw
ただのバカじゃんw

それで満足したんだ。はいはいよかったねw
すごいすごい。普通の感覚バンザーイw
0650デフォルトの名無しさん2005/05/07(土) 01:08:37
>>649
そうかい?
すぐにこの能力が羨ましくてたまらないときがくるよ。
まあ、きても気が付かないかもしれないけどw
0651デフォルトの名無しさん2005/05/07(土) 01:08:59
>>649
俺はあのレスは頭いいと思った。かなりおもろい。
06526232005/05/07(土) 01:09:56
>>647
まともに議論する気は無いということですか?
それともこちらの文章がわからなかったという話ですか?
少なくとも僕は否定的な感情で文章を書いていないですよ。
何が有用で、何が危険かを他人の感覚も含めて明らかにしたいだけです。

基本的に誰の話でもちゃんと聞いてみたほうが良いと思ったから
話を引っ張ったんですけどね。がっかりしました。
やっぱり2chでまともにやろうとするのが間違いだったようです。

スレ汚し失礼しました>皆様
■ このスレッドは過去ログ倉庫に格納されています