【C++】STL(Standard ..
49:デフォルトの名無しさん
05/11/03 15:28:09
おまいら既存のコンテナに頼りすぎてないか?
例えばvectorのインデックスで木を表現しても良いはずだ。
50:デフォルトの名無しさん
05/11/03 15:31:39
ならvector使わなくてもいいはずだ
51:デフォルトの名無しさん
05/11/03 16:19:13
>>49
読みにくいだろ。
ほかのコンテナをvectorで代用していったら、
何やってるか、わかんなくなってくよ。
52:sage
05/11/03 17:09:42
>これは誰もが辿る道だ。
え、オレ、そんな道辿ってないんだけど。
vectorに回帰と言うよりも、
どちらかというとboostにたどり着いたかな
53:デフォルトの名無しさん
05/11/03 17:37:53
on
54:デフォルトの名無しさん
05/11/03 18:40:12
vectorは既存のC/C++ソースの流用に関して柔軟に移植できる。
コピペ野郎には欠かせない存在だ。
・・・ま、生粋のコピペ野郎ならメモリ管理部分も
そのまま低レベル記述のままにしておくのだろうけど。
55:デフォルトの名無しさん
05/11/03 18:42:02
ま、確かにコンテナの中でstd::vectorだけは別格だという事は認める。
56:デフォルトの名無しさん
05/11/03 21:58:04
回帰と言うか、漏れにとっては「取り敢えずvector」とか「迷ったらvector」だなw
57:デフォルトの名無しさん
05/11/03 23:03:55
vectorから他のコンテナへの置換は大抵簡単だが、
逆は難しい場合が多いもんね。
とりあえずvector。
迷ったらvector。
58:デフォルトの名無しさん
05/11/04 00:20:38
STLとboostを使いこなせるほどのレベルになると、
C言語固有分野の実力もそれなりのものになっている可能性が高い。
このレベルになるとアドレスシーケンスが保証されたvectorだけで十分になってしまったりする。
C言語にはいくつかのループ記述(for、while、do-while)があるが、
結局最後にはforしか使わなくなるのに似ている、・・・と思ったがやっぱ似てないな。
美食家が最後に茶漬けに戻るのに似ている、侘び寂びの世界だ、・・・と思ったがやっぱ似てないな。
59:デフォルトの名無しさん
05/11/04 00:32:18
>結局最後にはforしか使わなくなるのに
んなこたーない。
60:デフォルトの名無しさん
05/11/04 01:14:19
for(;;)
while(1)
くらべてみよー
61:デフォルトの名無しさん
05/11/04 01:38:58
漢なら while (true) だ!
62:デフォルトの名無しさん
05/11/04 01:42:07
最近はfor(;;) しか見てないなー
ひょっとして陰で統一されつつあるのか??
63:デフォルトの名無しさん
05/11/04 01:51:43
そりゃぁ、ansiでわざわざそのためにfor(;;)を規格化したわけですから。
while (1)や while (true)は警告対象になるコンパイラも多いことだし。
64:デフォルトの名無しさん
05/11/04 02:57:26
>>63
マジデスカ
今までずっとwhile(true)だったよ…
65:39
05/11/04 03:43:52
>58
えぇー
例えば、listだと多くの操作が例外安全だからvectorよりも使い勝手が
良かったりするけどね……「取りあえずvector」というのはあるかもしれんが……
>ループ記述
最近はforも使わずにアルゴリズムに落としこむなぁ。
66:デフォルトの名無しさん
05/11/04 04:31:34
つーかさ
>>54あたりから>>58位までの、多くのレスは
ずっと自作自演やってる奴の1人の仕業だろ
バレテンダヨ
さっきからvectorの擁護ばかりで
ウザイ
67:>>56=59=63
05/11/04 04:43:10
>>66
んなこたーない。
68:デフォルトの名無しさん
05/11/04 11:24:55
> vectorの擁護
ワラタ
アホの子もここまでくるとちょっとな
69:デフォルトの名無しさん
05/11/04 12:05:15
>最近はforも使わずにアルゴリズムに落としこむなぁ。
馬鹿丸出しだな。
コールバック関数を用意してループ処理を隔離する事が、
常に近道だとは到底思えない。
コールバック関数とともにアプリ定義の引数渡しができない場合は、
スレッドセーフにするのが面倒である点も致命的。
70:デフォルトの名無しさん
05/11/04 12:47:55
>>69
つまり、
STLを否定してる発言
もう、こいつにつける薬はないな。
71:デフォルトの名無しさん
05/11/04 12:50:21
STLに馴染めないロートルは放っときゃいいんだよ。
72:デフォルトの名無しさん
05/11/04 12:58:24
たった今、STL全体とalgorithmを同一視する馬鹿な>>70を発見した。
新鮮な驚きだ。
73:デフォルトの名無しさん
05/11/04 13:12:48
>>72
負け犬の遠吠え
74:デフォルトの名無しさん
05/11/04 16:29:00
>>69
> コールバック関数とともにアプリ定義の引数渡しができない場合は、スレッドセーフにするのが面倒である点も致命的。
は
> コールバック関数を用意してループ処理を隔離する事が、常に近道だとは到底思えない。
の理由や説明になっていない。
75:デフォルトの名無しさん
05/11/04 16:57:18
並列だろ
76:デフォルトの名無しさん
05/11/04 18:44:04
どこにでも盲信者とアンチがいるのですね
77:デフォルトの名無しさん
05/11/04 18:56:24
理解できない話に出くわした時は
とりあえず信者・アンチと言っておけば
わかってるフリができる
78:デフォルトの名無しさん
05/11/04 20:47:17
確かにalgorithm関連の関数は引数仕様を変更して貰いたいと感じる。
Win32APIのようにマルチスレッドが前提となるOSのAPIはその点で抜け目がない。
79:デフォルトの名無しさん
05/11/04 21:11:06
>>78
STLのalgorithmは関数オブジェクトを渡せばいいだろ。
その関数オブジェクトのメンバでいくらでも渡せる。
80:デフォルトの名無しさん
05/11/04 21:15:16
>>78
bind1st bind2nd mem_fun って知ってますか?
81:デフォルトの名無しさん
05/11/04 23:25:57
もうSTLport5も出たっていうのに。
URLリンク(sourceforge.net)
82:39
05/11/04 23:59:36
>69
>コールバック関数とともにアプリ定義の引数渡しができない場合は、
>スレッドセーフにするのが面倒である
どういうこと?C++ではカリー化ができないという意味?
83:デフォルトの名無しさん
05/11/06 16:56:25
BCB6付属のSTLPortを最新版に変えるにはどうしたらいいの?
84:デフォルトの名無しさん
05/11/08 03:18:11
非常に初心者な質問ですみません。
VC++Toolkit2003のコマンドプロンプトにて
nmake -f vc71.mak
としてmakeしようとすると、エラーが大量に出てコンパイルが通りません。例えば
dll_main.cpp(86) : error C2084: function 'void _STL::__stl_throw_range_error(const char *)' already has a body
といったようなエラーが出ています。
どういう原因でエラーが出てるんでしょうか?また、どうすればきちんとコンパイルが通るようになるでしょうか?
85:デフォルトの名無しさん
05/11/08 03:39:19
祈る。
86:デフォルトの名無しさん
05/11/08 05:31:28
ダウンロードして上書き
エラーがでたら修正
87:デフォルトの名無しさん
05/11/08 08:35:44
>>84
STLportを使うのを諦める。
88:デフォルトの名無しさん
05/11/08 15:20:36
ちゃんとしたインストーラついたやつないの?
89:デフォルトの名無しさん
05/11/08 21:54:42
>>88
そんなに欲しけりゃ自分でインストーラ作れ。
ただでこんな素晴らしいライブラリが手に入る事だけでも感謝できないのかね君は?
90:デフォルトの名無しさん
05/11/08 22:25:40
インストーラが無いと使えないような香具師はプログラマを諦めた方がいい。
91:デフォルトの名無しさん
05/11/09 01:02:23
っていうかインストーラいらんじゃん
92:デフォルトの名無しさん
05/11/09 12:09:00
いるよバカ
93:デフォルトの名無しさん
05/11/09 13:49:09
>>92
>>90
94:デフォルトの名無しさん
05/11/09 21:08:12
無いと使えないような奴だけが必要なわけじゃないしな
95:デフォルトの名無しさん
05/11/10 00:04:19
list::sort()のアルゴリズムがよく解らないのですが、
これは何か名のあるアルゴリズムなのでしょうか?
96:デフォルトの名無しさん
05/11/10 00:11:19
template<class T>
class Hoge {
....
int foo(T arg);
};
で、
Hoge<void> hoge;
でも使える様にする、上手い手段って無い??
97:デフォルトの名無しさん
05/11/10 00:13:01
>>96
テンプレートの特殊化で検索汁
98:デフォルトの名無しさん
05/11/10 00:23:19
>>95
実装にもよるけど、大雑把にクイックソートしてから最後に挿入ソートが一般的
99:デフォルトの名無しさん
05/11/10 00:35:02
>>97
それだと
........
の部分を、ほぼコピペしなくてはいけなくなるので、それを回避したい
100:デフォルトの名無しさん
05/11/10 00:49:44
>>99
template<class T>
class SuperHoge {
....
};
template<class T>
class Hoge: public SuperHoge<T>
{
int foo(T arg);
};
template<> class Hoge<void>: public SuperHoge<void>
{
int foo(void);
};
ってやってSuperHogeで....の部分を共有すればいい
101:デフォルトの名無しさん
05/11/10 01:12:01
>>100
サンクス!!
明日、これを利用して発展させてみます
102:デフォルトの名無しさん
05/11/10 02:18:58
>98
いやlistのsortなんですが。
で、風呂に入ってゆっくり考えてたら、
再帰を使わないマージソートだと気が付いた。
103:98
05/11/10 02:31:38
>>102
ごめん。
普通のstd::sortと読み間違えてた。
104:デフォルトの名無しさん
05/11/10 17:22:48
std::mapのfindで、指定したキーの要素が無かった場合はNULLが返るんでしょうか?
105:デフォルトの名無しさん
05/11/10 17:25:16
map<>::iteratorにNULLはない。
返るのはend
106:デフォルトの名無しさん
05/11/10 17:28:55
受け取ったiterator == endならば無いと言うことなんですね
わかりました
107:デフォルトの名無しさん
05/11/10 19:30:44
キモイ仕様ですね
108:デフォルトの名無しさん
05/11/10 19:43:22
まぁstd::mapで要素の有無を調べるなら
countを使うしな。
109:デフォルトの名無しさん
05/11/10 19:48:28
こうして糞プログラムが量産されていくのでした
110:デフォルトの名無しさん
05/11/10 20:00:16
>>108
findならiteratorがそのまま処理に使えるしw
111:デフォルトの名無しさん
05/11/10 20:02:51
countの方が多少分かりやすいんだろうな
multi-ならfindじゃなきゃダメだろうけど
112:デフォルトの名無しさん
05/11/10 20:08:07
ソースの読みやすいSTLはどれですか?
113:デフォルトの名無しさん
05/11/10 20:28:28
>>110
見つけた要素を使って何か処理をするなら、勿論findだね。
でも有無を調べるなら、findは(ちょっとの差だけど)冗長だし直観的ではないと思う。
114:デフォルトの名無しさん
05/11/10 20:39:13
>>112
読みやすいかどうかは主観的なものなので、答えるとしたら
「知ったこっちゃねぇよ」だ。
115:デフォルトの名無しさん
05/11/11 01:52:17
そういえば、個人でOpen系に参加してるプロジェクトはSTLもboostも問題ないのに
今飯の種で参加してるVC6系の業務はSTLを使うと嫌われて、MFCのコンテナ使えって
お達しが来たなぁ
なんとか、STLをもっとC++ユーザに普及される道は無いんだろうか
あのままCPtrListをposを介してアクセスしてる糞ソースを見ると
今のプロジェクトが哀れに見えてくるんだが
116:デフォルトの名無しさん
05/11/11 10:05:46
初歩的な質問かもしれませんが
循環参照リスト(map)を作りたいです
循環参照といっても単なるディレクトリ構造で
1対多の双方向Treeなんですが(言葉が良くわからなくてゴメンナサイ)
どのコンポーネント使えばいいでしょうか
今はmapを使って smartポインタで構造体をラップして値を入れています
子→親は shared_ptr、親→子はweak_ptr
最後の子はヒープに残さないと消えてしまったり
delete時に親のmapから自分の登録を消す必要があったりと
なんか実装間違ってる気がしています
#今までSTLもMFCも毛嫌いしていましたけど、今回から仕事でも導入です
117:デフォルトの名無しさん
05/11/11 12:01:15
>>115
VC6付属のSTLはバグが多いのでそのお達しは正しい。
118:デフォルトの名無しさん
05/11/11 12:09:05
>>117
それはSTLじゃなくてtemplateの問題だろうに.
119:デフォルトの名無しさん
05/11/11 12:51:37
VC6同梱のバグ有りSTLはDinkumwareで修正した奴配ってたような気がする。
120:デフォルトの名無しさん
05/11/11 12:56:32
ついでだから調べて見たけど、リンク切れてるな。
URLリンク(dinkumware.com)
なんでもvectorの要素数拡張にバグがあったみたいね。
121:119=120
05/11/11 13:00:38
URL間違ってたスマヌorz
ここに詳細があった。
URLリンク(www.dinkumware.com)
SP3当たってればFixされてるようなことも書いてあった。
122:デフォルトの名無しさん
05/11/11 13:17:12
template<typename PosT>
class Coordinate2D{
PosT x, z;
};
template<typename PosT>
class Coordinate3D : public Coordinate2D{
PosT y;
};
template<typename CoordT, typename PosT>
class Polygon : public std::vector<CoordT<PosT> >{ //CoordTがテンプレートじゃねぇと怒られる
};
こんな感じで、class Polygon に std::vectorを継承し、
また、CoordT は Coordinate2D<PosT> か Coordinate3D<PosT> のみを
受け付けるようにするにはどうしたらいいのでしょうか?
あと、もしよろしければこういう設計のほうがいいとかあれば指摘お願いします
123:デフォルトの名無しさん
05/11/11 13:35:45
template<typename PosT>
-class Coordinate3D : public Coordinate2D{
+class Coordinate3D : public Coordinate2D <PosT> {
PosT y;
};
-template<typename CoordT, typename PosT>
+template<template <typename> class CoordT, typename PosT>
class Polygon : public std::vector<CoordT<PosT> >{ //CoordTがテンプレートじゃねぇと怒られる
};
+int main ()
+{
+ Polygon <Coordinate2D, double> p2;
+ Polygon <Coordinate3D, double> p3;
+ return 0;
+}
124:デフォルトの名無しさん
05/11/11 13:58:15
>>123
期待通りのものができそうです
ついでに typename と class の違いも消化できそうです
ありがとうございました
125:デフォルトの名無しさん
05/11/12 09:36:14
URLリンク(sourceforge.net)
STLport 5.0 正式版がリリースされているようですよ
126:デフォルトの名無しさん
05/11/12 09:55:16
>>81でがいしゅつ
127:デフォルトの名無しさん
05/11/12 10:00:04
だヵら何?
128:デフォルトの名無しさん
05/11/12 14:15:00
Q: それ自体が意味を持つ情報に向かって、「それで?」とか「だから何?」とか
返す人がいますが、これはどういう意味なのでしょう?
A: 「どうだ!」とばかりに披露した投稿にケチをつけられて悔しかった人が、
相手の発言を「その先に何かが無いと価値がない」ことにしたい時に使います。
しかしご存じのように、大抵は悔しさを見透かされるだけに終わり、成功の望みは薄いです。
129:デフォルトの名無しさん
05/11/12 16:05:28
ある簡単な問題を解くためにプログラムを作ったんですが,
vectorを使った場合とlistを使った場合で結果が異なりました.
問題はある複数の要素を入れ替えるのを繰り返すというものです.
listでやった場合は,要素の集まりlsの入れ替える先頭まで
イテレータを移動して,そこからc個だけ移動するので
さらにc個イテレータを移動し,その間の要素を
insertし,eraseしています.
for (int i = 0; i < n; i++) {
cin >> a >> b;
list<int>::iterator start = ls.begin();
for(int j = 0; j < a; j++) start++;
list<int>::iterator end = start;
for(int j = 0; j < b; j++) end++;
ls.insert(ls.begin(), start, end);
ls.erase(start, end);
}
このlistの部分をvectorに書き換えて,vにしたところ
for (int i = 0; i < n; i++) {
cin >> a >> b;
v<int>::iterator start = v.begin();
for(int j = 0; j < a; j++) start++;
v<int>::iterator end = start;
for(int j = 0; j < b; j++) end++;
v.insert(v.begin(), start, end);
v.erase(start, end);
}
異なる結果が出たのですが,どのような理由が考えられるでしょうか?
130:デフォルトの名無しさん
05/11/12 16:24:16
listの方はinsertしてもイテレータの指してる要素はそのまま使用可能だからいいけど
vectorの方は
v.insert(v.begin(), start, end);のところで
startとendのイテレータが駄目になってしまうから
その後にv.erase(start,end)ってやってはだめ
131:デフォルトの名無しさん
05/11/12 18:10:52
>>130
なるほど,vectorの場合は挿入,削除をしたら再取得しないとだめなのですね.
それに関しては分かったのですが,その後いくつか内容を出力してみたところ,
どうやら
v.insert(v.begin(), start, end);
この時点ですでにstartとendがずれているようでした.
ためしにv(内容は0,1,2,3,4)に対して以下のような操作をしたところ
vector<int>::iterator start = v.begin();
vector<int>::iterator end = start;
end++;
v.insert(v.begin(), start, end);
これと,startをインクリメントしたもの
vector<int>::iterator start = v.begin();
start++;
vector<int>::iterator end = start;
end++;
v.insert(v.begin(), start, end);
これだと結果が変わらないのですが,insert(pos, start, end)の
このstartは挿入したい要素の始まりのイテレータで,
endは挿入したい要素の終わりの要素の次のイテレータを指定しているのですよね?
なぜかstartをインクリメントしてもしなくても結果が変わらないのですが
どうなっているんでしょうか?
132:デフォルトの名無しさん
05/11/12 18:13:13
STLPort5.0.0をMinGWに無事インストールして、動いた人いる?
俺はビルドは成功したものの、いざプログラムで使うと、リンク時に
多量のリンカエラーが出て、今の所使えないので、4.6.2に戻してしまった。
133:デフォルトの名無しさん
05/11/12 19:58:59
vectorの全要素をファイルに出力したいんだけど、まとめてやる方法とかないの?
やっぱり、要素を一つずつファイルに出力するしかないのかな?
134:デフォルトの名無しさん
05/11/12 20:04:14
>133
std::for_each
135:デフォルトの名無しさん
05/11/12 20:04:41
>>133
copy+ostream_iterator
136:133
05/11/12 20:05:31
さっそくどうも
137:デフォルトの名無しさん
05/11/12 20:16:13
>>131
どうなると思っていて、実際にはどうなったかをちゃんと書け。
138:デフォルトの名無しさん
05/11/12 20:47:55
>>137
インクリメントとかは関係なかったようです.
知りたいことは,insert(v.begin(), start, end)として,
vの中身は 5 4 3 2 1. また,startは3で,endが2, なので
この場合3をbegin()の直前に挿入して 3 5 4 3 2 1 としたいのですが,
これが 4 5 4 3 2 1 になってしまいます.
挿入する位置,この場合であればbegin()よりも後にstartとendが
位置しているからおかしくなっているとは思うのですが,実際のところ
範囲を指定して挿入するinsert()は,挿入する位置よりも後にある
部分はvectorの場合指定できないということでいいのでしょうか?
139:デフォルトの名無しさん
05/11/12 21:02:51
ていうか挿入元の値が挿入してる最中に変わってしまうようなやり方は危険だからやめた方がいいよ
一度別のvectorにコピーしてから挿入するとかしないと
140:デフォルトの名無しさん
05/11/12 21:17:51
>>139
うーむやはり無難にコピーしたほうがいいのですね.
ありがとうございました.
141:デフォルトの名無しさん
05/11/12 21:22:43
>>138
23.1.1 Sequences Table 67
Sequence requirements (in addition to container)
expression │return type │assertion/note
│ │pre/post-condition
────────────
a.insert(p,i,j) │void . │pre: i,j are not iterators into a.
│ │inserts copies of elements in [i,j) before p.
とあるから、std::vectorにおいて、自分のiteratorを使っての
挿入にはinsertを使用してはならない。
142:デフォルトの名無しさん
05/11/13 15:59:15
>138
vectorの構造を考えれば、まあねぇ……
vectorが挿入用のスペースを用意するには、挿入箇所より後ろの部分を
順繰りに後ろにずらすのが一番手っ取り早いんだけど、そうすると、保存し
ておいたIteratorが使い物にならなくなるんだよね。
143:デフォルトの名無しさん
05/11/13 16:00:10
>138
あと、advacteとか使ったら?
144:デフォルトの名無しさん
05/11/13 16:02:26
>>142
ずらすだけで済めばまだいいが、再確保が起こる可能性まである。
どっちにしても使い物にならないという結論になるんだけどね。
145:デフォルトの名無しさん
05/11/13 18:50:32
>>143
advacteって何?std::advanceの事か?
146:デフォルトの名無しさん
05/11/13 20:24:57
std::mapで、文字列をキーにして使うことってできますか?
147:デフォルトの名無しさん
05/11/13 20:30:20
>>146
std::stringなら特に何も考えずに出来る。
148:デフォルトの名無しさん
05/11/13 20:38:04
stringってcinで使えないからなんかヤダ
149:デフォルトの名無しさん
05/11/13 20:39:17
>>147
ありがとうございます
150:デフォルトの名無しさん
05/11/13 20:45:21
stlのstringって中途半端だよね
sprintfみたいなの無いし
151:デフォルトの名無しさん
05/11/13 20:48:41
じゃあ作ってくれよ
152:デフォルトの名無しさん
05/11/13 20:56:50
>>150
stringはSTLじゃない。
153:デフォルトの名無しさん
05/11/13 21:00:41
なんで?
154:デフォルトの名無しさん
05/11/13 21:20:54
>>153
STLにbasic_stringなんてコンテナはないから。
STLのコンテナは
vector
list
deque
stack/queue/priority_queue
map/multimap
set/multiset
だけ。
STLに含めてもいいんじゃないかという意見もあるけど、
class myClass;
basic_string<myClass> str1;
ということが出来るclassはユーザー定義コピーコンストラクタ、
デストラクタ、コピー代入を持てないから一緒にするのはまずい。
155:デフォルトの名無しさん
05/11/13 21:25:12
>>150
(f)printf/(f)scanfがo(f)stream/i(f)stream(cout/cin)になったように、
sprintf/sscanfにはostringstream/istringstreamが存在する。
それが嫌ならboost::formatがある。
156:デフォルトの名無しさん
05/11/13 21:36:20
>>150
vectorとstringでいいじゃん
157:デフォルトの名無しさん
05/11/13 21:44:00
>154
C++ standardにはかわりないって。
string用のライブラリということでいいじゃない。そもそもSTLという用語自体あいまいだし。
>一緒にするのはまずい。
一緒にしちゃいけないのはコンテナも一緒だよ。
まあ、std::stringは失敗作くさいけどね……
158:デフォルトの名無しさん
05/11/13 21:45:09
>>154
STLってコンテナとアルゴリズムだけだっけ?
stirngとかbitsetは含まないのか。
159:デフォルトの名無しさん
05/11/13 21:49:02
std::stringは専用のメンバ関数が大杉
boost::string_algoみたいに非メンバでもっと汎用的に実装できなかったものか
160:デフォルトの名無しさん
05/11/13 21:54:27
std::basic_string<>がSTLじゃないというのは操作がiteratorベースじゃない点。
161:デフォルトの名無しさん
05/11/13 22:13:21
>>152-160 >>14
162:デフォルトの名無しさん
05/11/13 22:17:01
大量の文字列をstringに突っ込んでるときに一文字増やすと大変なことになるなw
領域確保無しでなw
やっぱり、動作まで考えるとメモリは気がぬけねーなw
メモリボコボコになってもいいから、再確保なんてしないで、
つけたし部分をリストのノードを追加する感じでやってほしかった。
163:デフォルトの名無しさん
05/11/13 22:21:13
大量の文字列をstringに突っ込むなよ
164:デフォルトの名無しさん
05/11/13 22:27:20
長い文字列は非標準だがropeクラスでいける・・らしい
165:デフォルトの名無しさん
05/11/13 22:45:05
std::stringはstd名前空間にあるのにSTLじゃないんですか?
std名前空間の定義って何ですか?
166:デフォルトの名無しさん
05/11/13 22:51:15
std名前空間にあるのはC++標準ライブラリ。勝手にhash_mapとか突っ込んだ馬鹿も複数居るが。
狭義のSTLと呼ばれるのはAlex Stepanovが作成しC++標準化委員会に提案した一連のライブラリに属するもの。
ついでにいうとStepanovのオリジナルには含まれていたがC++標準ライブラリには含まれて居ないものもある。
167:デフォルトの名無しさん
05/11/13 23:04:39
>>162
VCならvectorと同様reserve()が使える。
GCCの場合、reserve()は実装されていない。
メモリ再確保時に多めに確保されるのでそれで我慢するしかない。
168:デフォルトの名無しさん
05/11/13 23:09:28
>>167
> GCCの場合、reserve()は実装されていない。
はつみみです。
ソースきぼん。
169:デフォルトの名無しさん
05/11/13 23:13:04
stringってバッファをこま切れのポインタ配列で管理してんじゃなかったっけ、
んで、c_str()した時に一つの配列に確保し直すとかじゃないの?
170:デフォルトの名無しさん
05/11/13 23:17:53
stringにもiteratorあるよ?
171:デフォルトの名無しさん
05/11/13 23:18:43
>>169
他のstlは知らないが少なくともvcに付属のstlは
駒切れじゃなくてcapacity()を超えるごとに確保しなおしてるよ
172:デフォルトの名無しさん
05/11/13 23:18:47
>>169
何その無駄仕様な妄想
173:デフォルトの名無しさん
05/11/13 23:19:02
>>168
今gccのヘッダー見てみたけどreverse()はなかったよ。
174:デフォルトの名無しさん
05/11/13 23:23:15
stringの場合vectorと違って連続したバッファに確保しろと規定されてないからどう実装しようとOK
175:デフォルトの名無しさん
05/11/13 23:27:54
>>173
#include <string>
void f(std::string& s) { s.reserve(1); }
これがエラーになるのか?
手元の gcc 3.4.4 @cygwin では普通にコンパイルできたよ。
176:デフォルトの名無しさん
05/11/13 23:41:07
いつになったら>>173の大馬鹿が露見することやらw
177:デフォルトの名無しさん
05/11/13 23:42:47
>>176
お前ヘッダファイルって、もしかして読んだこと無いのか?w
178:デフォルトの名無しさん
05/11/13 23:43:26
×>>176
○>>173
>>173
どのヘッダー読んだんだ?w
179:デフォルトの名無しさん
05/11/13 23:44:51
<string.h>か<cstring>じゃまいか
180:デフォルトの名無しさん
05/11/13 23:46:57
>>179
それだと「GCCの場合、 basic_string は実装されていない。」ってなるだろ。
181:デフォルトの名無しさん
05/11/13 23:47:09
もっと根本的な問題でマジでreverseを検索したに1票w
~~~~~
182:デフォルトの名無しさん
05/11/13 23:47:18
良くワカランが、昔のgccを見たのかもね
なんにせよボケだが
183:デフォルトの名無しさん
05/11/13 23:47:41
>> 172
Stroustrup の C++ 本にはそんな感じの図(S式っぽいの)がのってたんで、
そんな感じだと思い込んでたが、違ったのね Σ(゚д゚lll)ガーン
184:デフォルトの名無しさん
05/11/14 00:05:28
reserve()がビルド通っただけでご満悦の>>175も問題だぞ。
誰か>>175にかまってやれよ。
185:175
05/11/14 00:10:10
いや、おかまいなく。
186:デフォルトの名無しさん
05/11/14 00:18:20
実運用上、ほとんどのケースで便利なのはGCCの仕様。
むしろVCのreserve()は、reserve()を呼び出さなければパフォーマンスが低下するので、
必要に迫られてreserve()を使う場合が多い。
いちいちreserve()呼び出ししなくてもそれなりのパフォーマンスを出すGCCの方が扱いが楽。
それはちょうど、FILEの入出力でいちいちフラッシュする手間が必要か否かに似ている。
明示的にフラッシュする必要がない方が楽なのは言うまでもない。
187:デフォルトの名無しさん
05/11/14 00:55:45
>>186
GCC と VC の reserve の仕様ってどう違うんですか?
188:デフォルトの名無しさん
05/11/14 01:04:30
reserveの仕様じゃなくてバッファ確保の仕様が違うんだろ?
189:デフォルトの名無しさん
05/11/14 01:10:02
>>187,188
reserve()に大きな数字を指定したのち、capacity()の戻り値を調べる。
さあ試せ。そして報告しろ。
190:デフォルトの名無しさん
05/11/14 02:40:41
結論:GCC最強
VCは糞
191:デフォルトの名無しさん
05/11/14 03:39:45
>>190
何が最強なのか言ってみ
192:デフォルトの名無しさん
05/11/14 03:45:27
・VCは以下の項目で最強です
シェア
ANSI準拠度
サポート
ヘルプ
ライブラリ
最適化
開発環境の使いやすさ
開発環境が求めるスペック
クライアントの盲信度
ゲイツ度
193:デフォルトの名無しさん
05/11/14 03:46:28
listの要素を追加するとき、push_back関数で一つずつ追加するのが
面倒なんだけど、これを一挙にやる方法は標準で装備されてないのかな?
例えば、
list<int> a;
a.push_back(34);
a.push_back(77);
a.push_back(25);
ってことをする代わりに、
a.add(34, 77, 25)
あるいは
a.add(3, 34, 77, 25)
みたいなことができればうれしいんだが。
ちょっと調べた感じでは無いみたいなんだけどな。
もし無いとしたら、これってちょっと面倒くさくない?
194:デフォルトの名無しさん
05/11/14 04:03:04
便利になる場面が思いつかない
195:デフォルトの名無しさん
05/11/14 04:10:50
list<int>& operator << (list<int>& a, int b) { a.push_back(b); return a; }
list<int>& operator , (list<int>& a, int b) { a.push_back(b); return a; }
list<int> lis;
lis << 1, 2, 3, 4, 5;
196:デフォルトの名無しさん
05/11/14 04:27:04
>>193
そんなに面倒だと思うなら自分で勝手に実装しろよ。
って書こうとしたら既に>195まで書かれていた罠。
197:デフォルトの名無しさん
05/11/14 04:33:03
自分で実装するんならBoost.Assignでも使った方が良さげ
198:デフォルトの名無しさん
05/11/14 04:35:44
そういや禿って不自然な演算子は書くな(widget += buttonみたいな)って行ってるのに
何で<<←こんな変なもん作ったんだ?
199:デフォルトの名無しさん
05/11/14 04:37:43
>>195
サンクス。非常に参考になりました。
200:デフォルトの名無しさん
05/11/14 04:39:40
operatorで変な定義しとくと後で困るのにwww
201:デフォルトの名無しさん
05/11/14 04:54:57
>>195
これって1,2,3,4,5の順に代入されるのって保証される?
202:デフォルトの名無しさん
05/11/14 05:16:26
yes
C++本3rd 6.2.2:
,(コンマ)、&&(論理積)、||(論理和)演算子では、左側の被演算子の方が右側の被
演算子よりも先に評価されることが保証されている。
だってさ
203:デフォルトの名無しさん
05/11/14 05:20:57
というか普通の2項演算子(左結合)と同じってだけか
204:デフォルトの名無しさん
05/11/14 05:22:59
operator<<は許せるとして
「,」にそんな定義したらまずいだろw
関数の引数にするときとかどうなるんだよw
205:デフォルトの名無しさん
05/11/14 07:31:47
>>204
func(lis, 1, 2) ← funcを3引数でcall
func((lis, 1, 2)) ← lis, 1, 2を実行の後、funcを1引数でcall
206:デフォルトの名無しさん
05/11/14 19:17:50
>push_back関数で一つずつ追加するのが
>面倒なんだけど、これを一挙にやる方法は標準で装備されてないのかな?
普通は、こんな漢字でない。?
strstreamでも同じでない。
std::ifstream in_file("sample_students.txt");
while (read(in_file, record)) // read and store all the records
{students.push_back(record);}
詳細は、acceleratedC++のソースを
207:デフォルトの名無しさん
05/11/14 19:32:17
>>202
それは組み込みの演算子だけの事情だし、評価順序と結合規則は別の概念だからここでは関係ない。
>>203で正解
208:デフォルトの名無しさん
05/11/14 19:56:09
>>193
Boostが嫌なら配列を使って何とかするというのもなくはない。
int Initializer[] = {34, 77, 25};
std::list<int> a(Initializer, Initializer + sizeof Initializer / sizeof Initializer[0]);
>>198
見た目からしていかにも流し込むという感じがして、なおかつ
元々の<<(シフト)の意味だってCで作られたものであり、数学的な歴史を持ったものでないから、
人々も比較的思い入れがなく馴染みやすいだろうということでこれにした、
というようなことがD&Eに書いてあったはず。
今手元になくて、大まかにしか思い出せないけど。
209:デフォルトの名無しさん
05/11/14 21:32:06
最初は < と > にしようと思ったけど、人々の頭には既に
「より小さい」「より大きい」という意味が強く刷り込まれていたので
シフト演算子にした、というのは、C++3rdのほうの氏の表現。
まぁ同じことを言っているのだと見ていいだろうね。
210:デフォルトの名無しさん
05/11/14 21:35:36
>>209
そう言われればそんなこともD&Eに書いてあったな。
211:デフォルトの名無しさん
05/11/15 20:05:54
<<= 演算子じゃいけなかったのかな?
212:デフォルトの名無しさん
05/11/15 20:07:18
あ、よく考えたら、<< と、<<= だと優先順位などの関係で
まとめてかけなくなるからダメか。
213:デフォルトの名無しさん
05/11/15 20:37:00
どっちにしてもキモくてなじめないなw
214:デフォルトの名無しさん
05/11/15 20:59:09
extern int operator BjaneStroustrup(int x,int y);
...
printf("output = %d",1 BjaneStroustrup 2);
...
output = 禿禿禿
215:デフォルトの名無しさん
05/11/15 21:04:36
ここ死んでるね。
216:デフォルトの名無しさん
05/11/15 21:06:02
>>214
コンパイルエラー
217:デフォルトの名無しさん
05/11/15 21:16:16
>>211
それだと入力が>>=になって見た目の対称が取れない。
218:デフォルトの名無しさん
05/11/15 21:29:49
MFC使いっす。
すっとばしてたSTLのことが気になってるんですけど、
勉強した方がいいコード書けるようになりますか?
winのアプリの性能が上がるとか、効率がよくなるとかなら勉強しようと
思うんですが、詳しい人教えてください。
219:デフォルトの名無しさん
05/11/15 21:33:56
じゃぁまずMFC使うのやめれ
220:デフォルトの名無しさん
05/11/15 21:36:09
MFCとSTLは競合するので同時に使用するのは無理ですよ
221:デフォルトの名無しさん
05/11/15 21:41:11
STL は汎用的な部品であって求めるべきなのは実行効率ではなく、開発効率じゃまいか?
222:デフォルトの名無しさん
05/11/15 21:41:33
>>218
そういうことを人に聞くような奴には使いこなせないと思う
223:デフォルトの名無しさん
05/11/15 21:46:02
>>220
偽。
>>221
何もかもインライン関数で書かれているからなんだかんだいって実行速度だって遅くない。
>>218
とりあえずMFCのコレクションクラスを使わずにSTLのコンテナクラスを使うことから始めてみろ。
224:デフォルトの名無しさん
05/11/15 21:47:55
>>219-220
普通にMFCでSTL使ったアプリを作って納品したことがあるのだが、
MFCとSTLが競合するとはどういうことなのか説明していただけるか。
225:デフォルトの名無しさん
05/11/15 21:49:13
>>218
コンテナクラス各種のことなら、使い方を間違うと性能を落とす可能性もあるが
保守性と開発効率と信頼性に効果があることが多い。
<algorithm>のような関数テンプレートのことなら、修得に難があるが
保守性と開発効率と信頼性に効果があることが多い。
>>219
んな無体な。
>>220
詳しく。
226:デフォルトの名無しさん
05/11/15 21:51:53
>>224
わしゃ、使うのやめろとは言ったが競合するとは言っとらんぞ
227:デフォルトの名無しさん
05/11/15 22:05:41
マルチスレッドのとき競合する事がある
228:デフォルトの名無しさん
05/11/15 22:08:35
>>227
それはMFCとSTLの競合ではないだろ。
229:224
05/11/15 22:22:54
>>226
大変失礼いたしました。てっきり同一人物かと早合点。
230:デフォルトの名無しさん
05/11/16 00:37:35
気になったのでぐぐってみた。
URLリンク(support.microsoft.com)
Q5 : MFC (Microsoft Foundation Classes) アプリケーションで標準 C++ ライブラリを使用した場合、C ランタイム ライブラリとの競合は発生しますか。
A5 : 競合は発生しません。MFC では、標準 C++ ライブラリと競合する C ランタイム関数は使用されていません。
とはいってもMSなので、地雷があったりするのかもしれんが。
231:デフォルトの名無しさん
05/11/16 00:43:06
ここで言ってる競合の意味は?「スレッドセーフでない」という意味?
必要に応じて自分で排他処理を埋め込む必要があるのはMFCだって同じ。
232:デフォルトの名無しさん
05/11/16 01:19:30
ちょい古めのMFCでは CreateThread で作ったスレッドで
Cランタイムライブラリ使うとメモリ損失をおこすのでダメ、
でもってSTL も shuffle やらに rand() 使ってたりするんでダメって話題じゃないの?
233:デフォルトの名無しさん
05/11/16 01:23:44
>>232
MFCとSTLの競合とはちょっと意味合いが違うような。
有益な情報だが。
234:デフォルトの名無しさん
05/11/16 04:30:42
下手の考え 休むに似たり
235:デフォルトの名無しさん
05/11/16 06:59:04
>>232
MFCを使った場合も同様。
MFCのクラスや関数を使う場合はAfxBeginThread()を使わなければならない。
STLだけを敬遠する理由にならない。
236:デフォルトの名無しさん
05/11/16 19:10:29
ようじょにインサートするにはどのクラスを使えばいいの?
237:デフォルトの名無しさん
05/11/16 20:08:17
MFC使うとモッサリするからなるべくATL+STLでやる
238:デフォルトの名無しさん
05/11/16 20:57:45
ATL使うぐらいなら
COM+SDKでオナニーした方がまし
239:デフォルトの名無しさん
05/11/16 21:30:49
ATL自体には全くといっていいほど魅力がないのだが、
WTLを使う場合に必要なのでいつのまにかATLを使ったことになる。そんな感じ。
240:デフォルトの名無しさん
05/11/16 21:37:14
ATLはATL::CA2Wみたいな文字列変換関連が便利。
あとGetWindowLongPtrなんかをきちんとinline関数で定義しなおしてくれるのがありがたい。
241:デフォルトの名無しさん
05/11/16 23:26:45
ATLはこれ作った奴はイカれた天才だと分かるが
MFCを見るとこいつは俺なみにバカだなと思う
この差はなにか。予算が違うのか
242:デフォルトの名無しさん
05/11/16 23:34:35
単に設計された時代の差。
243:デフォルトの名無しさん
05/11/17 02:39:52
そんないいわけは通用しない!
なんだあのコントロールバーは!
244:デフォルトの名無しさん
05/11/17 20:49:21
listでeraseを使っているとassertに引っかかりました
eraseを使っている行が原因だということまでは突き止めましたが
何が原因かわからないので教えてください
for (it=mylist.begin() ; it!=mylist.end() ; it++)
{
if (条件)
{
it=mylist.erase(it);
}
}
Expression: list iterator not incrementable
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
245:デフォルトの名無しさん
05/11/17 20:50:43
>>244
> Expression: list iterator not incrementable
これ読め。
246:デフォルトの名無しさん
05/11/17 20:55:06
>>245
>リストイテレータは加算できません
だと思うのですが何のことやらさっぱりです
加算といえばit++のことを指しているのでしょうがこれを無くすわけにもいきません
よろしくお願いします
247:デフォルトの名無しさん
05/11/17 20:55:41
お断りします
248:デフォルトの名無しさん
05/11/17 20:56:58
>>247
私のことを弄んだのですか?
249:デフォルトの名無しさん
05/11/17 20:57:13
>>244
つlist<>::remove_if()
250:デフォルトの名無しさん
05/11/17 21:04:00
>>246
ヒント: eraseの戻り値がend()かもしれない
251:デフォルトの名無しさん
05/11/17 21:07:25
>>249-250
ありがとうございます、理解できました
eraseがend()を指しているのにさらにit++してしまったのですね
remove_ifを使えば目的は達せられそうです
本当にありがとうございました
252:デフォルトの名無しさん
05/11/18 00:31:36
イテレータの不正領域インクリメントをassert()で教えてくれてるうちは、まだいい方でしょ。
インクリメント演算子の中で無限ループされた日には(ry
ブレークポイント置いてもどこで無限ループに突入したのか分からず困ったことがある。
253:デフォルトの名無しさん
05/11/18 01:24:47
アセンブラ読めないお前がヘタレすぎるだけだろ
254:デフォルトの名無しさん
05/11/18 07:50:40
つーか、ループ判定に使ってるイテレータを
わざわざeraseの戻り値で更新してるのがバカなだけだろ
255:デフォルトの名無しさん
05/11/18 09:30:07
要するに馬鹿と。
256:デフォルトの名無しさん
05/11/18 10:03:31
>>159
> boost::string_algoみたいに非メンバでもっと汎用的に実装できなかったものか
boost::string_algoは標準化される見込みが高いです。
URLリンク(www.open-std.org)
まあtemplateがなかった頃に設計されたものだからね。
専用のださメンバ関数は徐々にdeprecatedになっていくといいんだけど…
257:デフォルトの名無しさん
05/11/18 10:05:50
>>242
いや、MFC出た時点で、設計者はうすらとんかちだと思った。
258:デフォルトの名無しさん
05/11/18 15:24:37
>>254
いいえ、それ自体は普通の行動ですね。
バカなのは、それを「上手くやれない」人と、「それ自体がバカだと思っている」人だけです :-)
259:デフォルトの名無しさん
05/11/18 17:31:41
まぁそうむきになるなよw
260:デフォルトの名無しさん
05/11/18 18:10:53
>>257
「うすらとんかち」なんて単語見かけたの20年ぶり位かも。
261:デフォルトの名無しさん
05/11/18 18:38:33
うすらとんかち
262:デフォルトの名無しさん
05/11/18 19:42:33
>>256
うは、マジすか
次の規格改訂はshared_ptやらbindやらstring_algoやらで
かなり使い勝手が良くなりそうですな
263:デフォルトの名無しさん
05/11/18 19:57:45
標準化委員会はそんなに甘くない。
互換性という壁によって砕け散るだろうね。
264:デフォルトの名無しさん
05/11/18 21:51:31
とりあえずfilebufのコンストラクタにwchar_tなfilenameを渡せるようにしてくれると助かる。
Windowsだとそれなりに便利なのさ。なけりゃ自分で書くだけなんだけど。
265:デフォルトの名無しさん
05/11/18 21:57:47
正直標準にならなくてもboostがしっかり存在し続けていれば
それで良いような気がする。
266:デフォルトの名無しさん
05/11/19 01:32:10
>>264
URLリンク(www.open-std.org)
これのwstring版が欲しいって事だよね。
267:デフォルトの名無しさん
05/11/19 09:12:26
>>264
C++ 0xでfstream類のコンストラクタにFILE *を引数に取るコンストラクタを設けるという提案があった気がする。
これが実現すれば_wfopenが使えるようになって、それだけでもだいぶましなるのではと俺は思っている。
268:デフォルトの名無しさん
05/11/19 11:41:11
vectorって何でサイズ拡張するときにコピーコンストラクタとデストラクタを呼ぶの?
メモリ確保してデータを移動するんだったら↑のを呼ばなくても
ただmalloc→memcpy→freeだけでいいと思うんだが
269:デフォルトの名無しさん
05/11/19 12:19:53
そこまで単純なものじゃないから
270:デフォルトの名無しさん
05/11/19 12:30:44
いくらなんでも頭悪すぎだろ・・・
268はどんなクラス設計してきたんだ?
もしライブラリ自作してたらこいつのだけは
絶対使いたくないな。
271:デフォルトの名無しさん
05/11/19 12:33:14
いや、お前には使わせないから大丈夫(^o^)
272:デフォルトの名無しさん
05/11/19 13:04:21
頼まれても使わないから大丈夫(^ω^)
273:デフォルトの名無しさん
05/11/19 13:06:36
>>268
C使っときなさい。
274:デフォルトの名無しさん
05/11/19 13:13:13
まぁ、stlのvectorは無駄が多いのは周知の事実なわけだがな
275:デフォルトの名無しさん
05/11/19 13:23:22
無駄が多いのはおまいの設計が悪いだけ
276:デフォルトの名無しさん
05/11/19 13:35:05
低能はvbでも使っとけ
277:デフォルトの名無しさん
05/11/19 13:45:37
vectorを使ったとしても、プログラマはリソースの明示削除手続きから解放されるだけであり、
無駄が出ないように工夫する義務はプログラマにある。
278:デフォルトの名無しさん
05/11/19 13:55:40
まだvb馬鹿にしてる奴がいるのか、さすがstl厨
279:デフォルトの名無しさん
05/11/19 14:10:26
VBは所詮VB
280:デフォルトの名無しさん
05/11/19 16:07:53
STLとSTOってどっちがつおいの?
281:デフォルトの名無しさん
05/11/19 16:16:46
>>268
たとえばわざとらしいけどこういうクラスをvectorの要素にすることを考えてみたらいい。
class hoge
{
public:
hoge(int n) : num(n), p(this) {}
hoge(const hoge& x) : num(x.num), p(this) {}
int get() const {return p->num;}
private:
int num;
const hoge *p;
};
282:デフォルトの名無しさん
05/11/19 16:18:04
>>280
答えはキミの中にあります
283:デフォルトの名無しさん
05/11/19 17:17:07
コピーコンストラクタがいやなら shared_ptr 使うか、
vector<hoge* > ってすべきだな。
あとインスタンス化のたびに競合おこしたりとかいうのもあるし、
初期化~終了までファイルロックする類のクラス作ったりすると。
284:デフォルトの名無しさん
05/11/19 19:30:38
boost::ptr_vectorでもよい。
285:デフォルトの名無しさん
05/11/21 17:47:41
class FinallyCloseHandle {
private:
HANDLE h_;
public:
FinallyCloseHandle(HANDLE h) : h_(h)
{ if (h==INVALID_HANDLE_VALUE) throw; }
~FinallyCloseHandle() { CloseHandle(h_); }
};
というクラスを用意して
HANDLE file = CreateFile(...)
auto_ptr<FinallyCloseHandle> fch(new FinallyCloseHandle(file));
として、スコープを抜けるときに自動解放するようにしてるんですが、
これを汎用的に行う方法はないでしょうか
CloseHandle以外にも、いろいろ終了処理はありますが、
それに対して毎回似たようなクラスを作るのは、スマートとは思えません
atexitみたいな形で、スコープを抜けるときに呼び出す関数を
積んでおくことができると理想なのですが
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4273日前に更新/228 KB
担当:undef