1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:11:32] C++ のジェネリックプログラミングの話をしましょう。 以下のスレッドを統合するスレです。 STLスレッド Part1 pc.2ch.net/tech/kako/1004/10042/1004287394.html Part2 pc3.2ch.net/tech/kako/1026/10267/1026793823.html 【C++】Boost使い集まれ! pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?) Generic Programming with C++ Template pc.2ch.net/tech/kako/1008/10085/1008593126.html 【C++】template 統合スレ -- STL/Boost/Loki, etc. pc2.2ch.net/tech/kako/1037/10377/1037795348.html 【C++】template 統合スレ -- Part2 pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち) 【C++】template 統合スレ -- Part3 pc5.2ch.net/test/read.cgi/tech/1066493064/ (html化待ち) 【C++】template 統合スレ -- Part4 pc5.2ch.net/test/read.cgi/tech/1083550483/ (html化待ち) 【C++】template 統合スレ -- Part5 pc5.2ch.net/test/read.cgi/tech/1091522597/ 関連スレ、その他リンクは >>2-5 あたりに。
207 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:24:10] こういう書き方って動作は保証されるのでしょうか? std::vector<int> test; for ( std::vector<int>:iterator element = test.begin(); element != test.end(); element++ ) { test.erase(element); }
208 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:30:51] ↑おもいっきりぬけてたので修正しました std::vector<int> test; test.push_back(0); test.push_back(1); test.push_back(2); test.push_back(3); test.push_back(4); for ( std::vector<int>:iterator element = test.begin(); element != test.end(); element++ ) { if ( *element == 2 ) { test.erase(element); } }
209 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:35:21] >>208 eraseした時点でイテレータそのものが無効になるよ。
210 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:38:08] ではループしつつ条件に当てはまるイテレータの内容だけ削除するには どのような手段を用いればよいのでしょうか? プールで一端どこかにマークをつけて、ループ終了後該当の物だけeraseとかでしょうか?
211 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:38:33] だから、std::remove()で、値が2の要素をコンテナの後に集めておき、最後に一回だけ eraseするといい。 test.erase(std::remove_if(test.begin(), test.end(), std::bind2nd(std::equal<int>(), 2)), test.end());
212 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:38:57] あ、ループがプールに・・orz
213 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:39:57] なるほど、ありがとうございます
214 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:40:36] こういう書き方は最初は戸惑うかもしれないが、慣れるとすごく便利になる。 そのうちこれでも不便になって、必ずboost::bindとかに手を出したくなるから。
215 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:43:26] わかりました。 参考にしてみます。
216 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:43:57] というか、EffectiveSTLを読め。 >>211 のも含めて色々書いてあるから
217 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:50:47] test.erase(std::remove(test.begin(), test.end(), 2), test.end()); でもいいねこの場合。叙述関数あるいは関数オブジェクトの替わりにconstな値を とるだけだから。
218 名前:デフォルトの名無しさん mailto:sage [05/01/10 17:58:23] if ( *element == 2 ) { test.erase(element++); } でOK。
219 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:01:18] >>218 は忘れて。 for ( std::vector<int>:iterator element = test.begin(); element != test.end(); ) { if ( *element == 2 ) { element = test.erase(element); } else ++element; }
220 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:01:28] >test.erase(std::remove_if(test.begin(), test.end(), std::bind2nd(std::equal<int>(), 2)), test.end()); わけがわかりません。 こんなの仕事で使われたら恐怖です。 やめてください。
221 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:02:08] >>217-219 やめてください。 怖いです。
222 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:02:50] >>218 vectorコンテナのeraseはCで言うところのrealloc()に相当する動作を実行する 事もあるんだぞ。でたらめ書くな。
223 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:03:47] >>220 そのくらいのSTL構文も分からないならC++使うのをやめた方がいいよ。
224 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:06:37] >>222 おいおい。 「イテレータは、より小さなインデックスの要素が挿入または削除されたり、再割り当てが 行われて容量が変わるまで有効」だぞ。 規格票をよく読め。おまえこそでたらめ。
225 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:10:44] 規格票でました。 m9(^Д^)プギャー
226 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:12:25] §23.1.2.8当たりだろ。
227 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:13:13] www-6.ibm.com/jp/developerworks/linux/041203/j_l-cpregex.html >言語の機能 であるはずのものが、その言語のユーザーを恐れさせるようになったら、何かを変えるべき時なのです。
228 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:13:59] >>226 それAssociative Container
229 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:15:05] ここは 問題を無闇に複雑にして悦に浸る馬鹿のス靴(なぜか変換できない) ですね。
230 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:19:30] §23.2.4.3当たりだと見た。
231 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:20:25] >>227 >>229 またperlとかrubyの○キ信者ですか?
232 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:23:27] boostが異常なのは認めなければなるまい。 昨今のC++は異常が常態。
233 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:24:29] 確かに異常だが、使っているうちに快感になる。
234 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:24:50] (23.1.1/7)と(23.2.4.3/3)読む限り>219でもOKっぽいですね
235 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:27:46] CommonLispのようなわかりにくさを競い合って悦に浸るのがここの流儀
236 名前:デフォルトの名無しさん mailto:sage [05/01/10 18:28:39] >>234 OKだろ。個人的には俺はあまり書きたくないけど。
237 名前:デフォルトの名無しさん [05/01/11 00:57:13] >>219 引くってのはどうよ。 for(element = test.begin(); element != test.end(); ++it) { if(*element == 2){ test.erase(element--); } } あ、でも element = test.begin(); element--; は大丈夫なのかな。 まぁ、EffectiveSTLを読んでいれば test.erase(remove(),test.end())と書くというのに一票。
238 名前:237 [05/01/11 00:58:59] 訂正。 >>237 ++it => ++element
239 名前:デフォルトの名無しさん mailto:sage [05/01/11 01:06:22] >>237 ダメ
240 名前:デフォルトの名無しさん mailto:sage [05/01/11 14:28:58] for(element = test.begin(); element != test.end(); ++element) if(*element == 2) { element = --test.erase(element); } こんな感じが一番シンプルなところなのかな?
241 名前:デフォルトの名無しさん mailto:sage [05/01/11 15:04:23] removeとeraseの組み合わせが一番シンプル
242 名前:デフォルトの名無しさん mailto:sage [05/01/11 15:59:47] とりあえずremoveとeraseの組み合わせが何でも一番です(^^
243 名前:デフォルトの名無しさん mailto:sage [05/01/11 16:01:18] clearって手もあるよ
244 名前:デフォルトの名無しさん mailto:sage [05/01/11 19:46:02] >>223 プロジェクトって大抵いろんな技術レベルの人がいるから その台詞でばっさりはちょっと抵抗あるなぁ。 一人でやるなら何使ったってOKだけどね。
245 名前:デフォルトの名無しさん mailto:sage [05/01/11 20:32:55] >>244 211はかなり基本だと思うんだけど...
246 名前:デフォルトの名無しさん mailto:sage [05/01/11 20:46:56] あれが解からないって? …ときどき思うんだ。俺、なんで2chなんか見てるんだろう、って。
247 名前:237 [05/01/11 22:30:46] なんか不安になってきたので確認したいのですが vectorのeraseで無効になるのは消した要素以降のイテレータですよね。 だから>>237 と>>240 は結果的に同じことになりますよね? 私が>>237 で心配だったのは 最初の要素でヒットしたとき、 element = test.begin(); --element; ++element; でbegin()に戻るのが規格で保証されてなさそう(多くの実装では戻りそうだけど) というのと 元々のサイズが1のとき、test.erase(test.begin());で全てのイテレータが無効になる ときにバッファを解放してbegin()とend()がNULLを返してくるようになるとend()と 永遠に一致しなそう(VC7のclearがバッファを解放(capacityを0)にしてくれるのに 気づいて以来疑り深くなっています) の二点なんですけど、 そのあたりをふまえて>>239 はダメと言っているんですよね? うーん、remove(や類似のアルゴリズム)を使わないでやるならやはり>>219 なのか。
248 名前:237 [05/01/11 22:34:15] ああ、そうか、後者の不安は>>240 と書くことで払拭されるのか。 スマソ
249 名前:244 mailto:sage [05/01/12 01:12:53] >>245 俺も基本だと思ってるし、これぐらいわかれよって思ってるよ。 でも、それが通用しないのが多人数でしょ?って投げかけ。 …技術と関係なくなるか。消えるよ。スレ汚しすまん。
250 名前:デフォルトの名無しさん mailto:sage [05/01/12 02:17:30] なぜforで回す……わざわざC++使うんだったら、効率にも気を 配らないともったいないよ。 >247 >237 >240の例だと ・ループごとにtest.end()の呼び出しが発生する ・elementを削除するたびにvectorの再パッケージが発生する で遅くなりますな。 あと、>237だと後置インクリメントの一時オブジェクトの生成が 発生してさらに効率が悪くなります。
251 名前:デフォルトの名無しさん mailto:sage [05/01/12 02:18:18] なぜにremoveを使いたくないのかが知りたい
252 名前:250 mailto:sage [05/01/12 02:24:13] 自己フォロー >237>240ともに、はelement==test.begin()のときに *element==2だとアウトですな。 #test.begin()よりも前に移動するから未定義の世界に突入
253 名前:デフォルトの名無しさん mailto:sage [05/01/12 02:48:28] >250 ループごとのtest.end()も後置インクリメントもここでは本質じゃない。
254 名前:デフォルトの名無しさん mailto:sage [05/01/12 02:56:25] >253 ふうん、じゃ、こう言っておこうかな ・郷に入れば郷に従え STLはC++の一部なんだから、それぐらい覚えろ ・こんぐらいできないなら、そもそもC++使うな or こんなこともできないやつをプロジェクトに入れるな 他にもPerlとか色々あるんだから、わざわざC++を使う必要ないよね。
255 名前:デフォルトの名無しさん mailto:sage [05/01/12 07:36:48] list に追加されている remove(),remove_if() 見習って、 template<class Container> void remove(Container&, typename Container::value_type const&) template<class Container, class Predicate> void remove_if(Container&, Predicate p); のような関数を作れば、双方文句はなかろう。
256 名前:255 mailto:sage [05/01/12 07:50:40] s/Container/Sequence/ remove() の意味が混乱を招きやすいという認識はSGIのドキュメントにも記載されている。 「慣用句だ」と言って押し切るよりは、むしろまともな認識だと思う。 www.sgi.com/tech/stl/remove_if.html#1 これをそのままソースに書いてしまうと言うのは、 例えば定数除算をシフトで書いてしまうのと同等の誤りであると思う。
257 名前:デフォルトの名無しさん [05/01/12 07:51:49] forで回すからうっかり>>218 とか>>237 とか>>240 とかいう問題のあるコードを書いて しまうんだよ。 だったらおとなしくremoveを使えと。 まぁ、色々書き方があってその中から適切な物を状況に応じて選ぶのがプログラムの 醍醐味ではあるけど。
258 名前:デフォルトの名無しさん mailto:sage [05/01/12 08:53:47] >なぜにremoveを使いたくないのかが知りたい 叙述関数やoperator==とかにコードが分散するのがイヤ ループが内包されるのがイヤ ループを制御下に置いておきたい ブレイクポイントが設定しやすいよ 削除以外の用途にループが流用できるよ てゆうかぶっちゃけremove_copy中でやってること、あれはありえないでしょ それを言ったらvectorでeraseすること自体ありえないかw
259 名前:デフォルトの名無しさん mailto:sage [05/01/12 09:59:55] >ループが内包されるのがイヤ ループを制御下に置いておきたい ループを明示的に書くより効率が良くなる可能性があるし、 コードの見通しも良くなる
260 名前:デフォルトの名無しさん [05/01/12 10:06:05] >>254 「理想郷」との差でしかモノを語れない 頭でっかちの引き籠もりはレスしなくていいです ;-)
261 名前:デフォルトの名無しさん mailto:sage [05/01/12 10:32:21] >260 それ、オレじゃない。人違いだ
262 名前:デフォルトの名無しさん [05/01/12 10:48:33] >260 IDくらい見ろ、ボケ!
263 名前:デフォルトの名無しさん mailto:sage [05/01/12 11:10:58] >>262 この板ID無いんだって気付よ!
264 名前:デフォルトの名無しさん mailto:sage [05/01/12 11:21:54] お前さんたちなんか楽しそうだね。
265 名前:デフォルトの名無しさん mailto:sage [05/01/12 11:42:25] IDの見方知らない香具師ってまだいたんだね
266 名前:デフォルトの名無しさん mailto:sage [05/01/12 12:13:29] はっきりいってvectorに限らず配列っぽいデータ構造を使っている時に removeみたいなアルゴリズムを適用したくなることってあるか? 無理して適用しておもしろいことがあるようなものでもないと思うのだけど… 何か見落としている革新的な理由でもあったりするのだろうか?
267 名前:デフォルトの名無しさん mailto:sage [05/01/12 23:55:01] > removeみたいなアルゴリズムを適用したくなることってあるか? 配列から複数の要素を一度に取り除きたいときだな。
268 名前:デフォルトの名無しさん mailto:sage [05/01/13 00:11:28] 簡単 let remove x num = snd (List.partition (fun a -> a=x) num);;
269 名前:デフォルトの名無しさん [05/01/14 14:04:12] >>268 配列っぽくないデータ構造。
270 名前:デフォルトの名無しさん [05/01/15 01:33:25] >>267 そそ、端からeraseしてると効率悪いし、 効率的な処理にしようとすると意外に面倒。
271 名前:デフォルトの名無しさん mailto:sage [05/01/17 09:41:54 ] 俺も小さくて、しかもあまり使わないような関数を分散させるのが嫌いなんだけど、 「リファクタリング」を読むと、一行処理すら場合によっては関数にすることを推奨してるんだよな。 しっかりした関数名をつけることによって可読性が高まるって話なんだけど、 必ずしもそうとは思えないのは、英語圏ネイティブじゃないせいかね。 と、templateスレに書き込もうとしたのだけど、主旨に合わないのでこっちに投棄
272 名前:デフォルトの名無しさん mailto:sage [05/01/17 09:43:01 ] C++スレに書くつもりが… もうどうでもいいや
273 名前:デフォルトの名無しさん mailto:sage [05/01/17 13:41:34 ] リファ〜に書いてあるのは関数じゃなくてメソッドのことでは 何の分類もしない単独の関数増やしてくのはあんま良いとは思えないが メソッドの場合インターフェース抽出とか階層整理とかで意味がある
274 名前:272 mailto:sage [05/01/17 17:58:06 ] >>273 失礼、つい関数と呼んじまう。 インターフェース抽出や階層整理は、それ自体をメインにして行うべきな気がするんだよねぇ。 それどころかそれ以前で、非道い話だが「たくさんの、たった数行のメソッド」ってだけで、嫌悪感を感じてしまう。 いずれにせよスレ違い申し訳ない。
275 名前:デフォルトの名無しさん mailto:sage [05/01/18 00:41:35 ] >>273 そんな区別ないだろ。 少なくともC++ではthisポインタの有無しか違いはないわけで、 それが関数分けの基準に影響するとは思えない。
276 名前:デフォルトの名無しさん mailto:sage [05/01/18 01:35:22 ] 時々272のような人いるよね。 読むときあっちこっちの関数みないといけないから、とか言って。 このヘタレが
277 名前:デフォルトの名無しさん mailto:sage [05/01/18 01:45:39 ] そもそも行数とか関係ないだろ
278 名前:デフォルトの名無しさん mailto:sage [05/01/18 02:41:33 ] >275 その他にも可視性とアクセス範囲に違いがあるわけで……
279 名前:デフォルトの名無しさん mailto:sage [05/01/18 08:17:20 ] >>278 そうだな。 それらが要るならクラス作ってメンバ関数を作ればいいし、 要らないならフリー関数にしてもいい。 どう整理するかどうかが違うだけで、 処理に名前をつけてまとめたほうがよいかどうかの基準には関係ない。 複数のフリー関数を作った後に、さらに それらをまとめてクラスを作ればよいことに気付くことも考えられる。 思い立ったらさっさと名前付けてまとめれ。 渋る意味がわからん。
280 名前:272 mailto:sage [05/01/18 08:20:53 ] ちとスレ違い悪いんでこっちでレス pc5.2ch.net/test/read.cgi/tech/1099112338/41
281 名前:デフォルトの名無しさん mailto:sage [05/01/21 18:18:02 ] お聞きしたいのですが、 下記(次レス)のコードがVC7.1でコンパイルできませぬ。 どこがいけないのでしょうか… 色々実験してみた結果 ・UINT を int にすると通る。 ・UINT を std::size_t にしてもダメ。 ・typename T を削除して、 boost::array の T を int とかにすると通る。 ・boost:array の nSize を適当な数値で直打ちすると通る。 ・bcc5.5.1 では普通に通る。
282 名前:281 [05/01/21 18:18:34 ] #include <boost/array.hpp> typedef unsigned int UINT; template<typename T, UINT nSize> class A { typedef typename boost::array<T, nSize> tObjects; typedef typename tObjects::iterator tObjectsIt; tObjects m_cObjects; public: tObjectsIt Func(); }; // ↓C2244:関数の定義を既存の宣言と合致させることができませんでした。 template<typename T, UINT nSize> inline typename A<T, nSize>::tObjectsIt A<T, nSize>::Func() { return m_cObjects.begin(); }
283 名前:デフォルトの名無しさん [05/01/21 20:49:28 ] >>281 手元にVC7.1もboostもないし、よくわからんけど、 コンパイラがバグってることはよくあるからw
284 名前:デフォルトの名無しさん mailto:sage [05/01/21 20:57:34 ] >>282 g++(3.3.3)ではなんの警告もエラーもなく通るのぅ……
285 名前:デフォルトの名無しさん mailto:sage [05/01/21 21:31:52 ] >>282 戻り値を素直に typename boost::array<T, nSize>::iterator とすると通りますね。
286 名前:デフォルトの名無しさん mailto:sage [05/01/22 00:57:24 ] typedefがprivateなのにinlineなのがいけないんじゃないのか? と試してもないのに言ってみる
287 名前:281 mailto:sage [05/01/22 11:00:38 ] やはり、コンパイラが悪い方向なんですか… orz なお、>>286 を参考に、 すべてのメンバをpublic にしてみてもコンパイルが通りませんでした。 しょうがないので、現状では ・class内に直書き ・>>285 の方法 の2点で回避したいと思います。 どうもありがとうございました。
288 名前:デフォルトの名無しさん mailto:sage [05/01/22 11:27:55 ] いまだにちゃんと動かないコンパイラ多いのかよ おまえらC++信用できますか?
289 名前:デフォルトの名無しさん mailto:sage [05/01/22 11:28:34 ] C++なら信用できるよ。
290 名前:デフォルトの名無しさん mailto:sage [05/01/22 15:39:27 ] >>282 vc8 でもダメっぽい
291 名前:デフォルトの名無しさん [05/01/23 15:44:13 ] boost::bindはstd::bind2ndとかより実行速度が落ちるって本当ですか?
292 名前:デフォルトの名無しさん mailto:sage [05/01/23 16:18:47 ] >>291 ためして、みなさいって。
293 名前:デフォルトの名無しさん mailto:sage [05/01/23 16:20:48 ] using句が,による複数引数を受け付けないのは何故ですか? using A::AA, A::AB, A::AC; のように出来たら便利だと思うのですが?
294 名前:デフォルトの名無しさん mailto:sage [05/01/23 17:06:31 ] 本スレの次スレ 【標準C++】C++相談室 part39【STL含む】 pc5.2ch.net/test/read.cgi/tech/1106466303/
295 名前:デフォルトの名無しさん mailto:sage [05/01/23 17:51:32 ] >>293 そんなんオレらに聞かれても困るよ
296 名前:デフォルトの名無しさん mailto:sage [05/01/23 17:57:05 ] >>293 プリプロセッサマクロを書くとか? あんまり便利とも思えないけど
297 名前:デフォルトの名無しさん [05/01/23 22:42:53 ] boost(かSTL)に、次のような関数テンプレートって含まれていませんか? template<typename T> inline void assign(T& lhs, const T& rhs) { lhs = rhs; } 次のような感じで、setterを用意していないメンバ変数(m_is_foo)を変更する関数オブジェクトを作るのに使いたいのです。標準であるならそっちを使いたいなと思いまして。 hoge(boost::bind(assign<bool>, boost::ref(m_is_foo), true));
298 名前:デフォルトの名無しさん mailto:sage [05/01/23 23:01:05 ] >>297 試してないけど、 hoge(boost::lambda::var(m_is_foo) = true) じゃだめ?
299 名前:297 mailto:sage [05/01/23 23:16:36 ] >>298 > 試してないけど、 hoge(boost::lambda::var(m_is_foo) = true) じゃだめ? いけました。サンクスです。 うーん、lambdaか…。主観ですが実戦投入はちょっと怖いんですよね。
300 名前:デフォルトの名無しさん mailto:sage [05/02/07 09:18:51 ] ふぇ〜い Boostを最新リリースにしたら@VC6 _bvector.hでコンパイラが内部エラー起こしてビルドできない Releaseビルドなら通った コンパイラもしょっちゅう固まるし やっぱ テンプレートをプリコンパイルヘッダにしたのが悪いのかな ・・
301 名前:デフォルトの名無しさん mailto:sage [05/02/07 09:23:19 ] 日記はMeadowにでm(ry
302 名前:デフォルトの名無しさん mailto:sage [05/02/07 09:28:51 ] >>300 ヘッダのインクルード順序を変えてみれ。 自分は面倒なので#ifとか使ってインクルード順序をすぐに変えられるようにしてる。 例: #if 0 //ここを1にしたり0にしたりする。 #include <boost/regex.hpp> #include <algorithm> #else #include <algorithm> #include <boost/regex.hpp> #endif
303 名前:デフォルトの名無しさん mailto:sage [05/02/07 14:42:53 ] Meta-Programming 専用のスレってない?
304 名前:デフォルトの名無しさん mailto:sage [05/02/07 17:41:03 ] あったけど、ここに統合。
305 名前:デフォルトの名無しさん [05/02/11 13:36:27 ] テンプレートを使ったクラスでundefined referenceがでます。 ソースは次のようなものです。プリプロセッサは省略してあります。 //temptest.h template<class T> class temptest{ public: temptest(); }; //temptest.cpp template<class T> temptest<T>::temptest(){} //main.cpp int main(){ temptest<int> t; return 0; } gccでは "undefined reference to `temptest<int>::temptest(void)" VisualC++6では "public: __thiscall temptest<int>::temptest<int>(void)は未解決です" というエラーです。 ちなみに定義をインラインにしたらうまくできました。 どなたか解決方法を教えてください。
306 名前:デフォルトの名無しさん mailto:sage [05/02/11 13:40:12 ] >>305 templateの定義はヘッダに書かないとダメ、ということになってます。
307 名前:304 mailto:sage [05/02/11 13:50:47 ] そんな決まりがあったんですか。 でもSTLのインクルードファイルを見たところ宣言だけのようですが、 STLは特別なんでしょうか。