1 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:01:17 ] C++標準ライブラリの一つ、STLについて。 前スレ 【C++】STL(Standard Template Library)相談室 9 pc11.2ch.net/test/read.cgi/tech/1204045410/ 過去ログ・リンク・書籍紹介は >>2 以降
362 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:31:04 ] >>359 VB知らないんだけど、この場合のm_item_numってなに? それ次第では、そもそも「内容は全く同じ」という認識が間違ってたことに。
363 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:35:47 ] VBとコードが違わないか? >for( i= 1; i< 0xFFFF; i++ ){ for( i= 1; i<= 0xFFFF; i++ ){ 調べてる要素が違ってるなら50倍違ってもおかしくはないけど。 あとは計測時間が短すぎて時間を計ってるタイマーの精度の違いが出てるとか とりあえず>>351 のコードをReleaseビルド&_SECURE_SCLでコンパイルしてVBより50倍も遅いなんてことあり得ないだろ。
364 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:53:51 ] >359 ちゃんと最適化かけたか?
365 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:06:10 ] STLがVBに負けるなんて悔しい ビクンビクン
366 名前:351 mailto:sage [2008/11/08(土) 15:08:04 ] すみません。デバッグビルドになってたようです>< なんかデバッグなしにしたり最適化とかするとエラーが出てコンパイルできなかったので、何となく諦めてました。 >>359 をやった上で最適化まですると、VBより速くなりました。 めでたしめでたし。
367 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:10:02 ] しね
368 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:12:42 ] まさにVB脳
369 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:14:42 ] 二重ループのかわりにstd::find_ifを使ってみようぜ! あと上で言ってる人もいるけどsortするならむしろstd::vectorのかわりにstd::setを使おうぜ Itemがidをもつぐらいなら用途にあってる可能性高いし
370 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:20:36 ] VBでもデータ構造を変えれば劇的に速くなるな。
371 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:27:41 ] >>369 ちょっとよく分かりませんが、勉強してみます。 今はVBのコードをC++にツラツラ置き換える作業だけをやってます。 VBの配列 → std::vector VBのString → std::string という置き換えで、今のところこれ以上のSTLの知識はありません。 アルゴリズムを下手に変えると、新たにバグが混入することになるので。
372 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:33:36 ] VB6と一緒に心中してくれよ。こっちくんな。
373 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:40:28 ] 移植させてもらえるだけでも素晴らしいことだと思わないか。
374 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:44:24 ] つうか既にバグ混入しててワロタ >for( i= 1; i< 0xFFFF; i++ ){
375 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 16:03:45 ] findを使って作ってみました enum { N = 600, ID_MAX = 0xffff }; template<typename ID> struct Compare { Compare(ID i) : m_i(i) {} template<typename T> bool operator()(T const& i) { return i.id == m_i; } private: ID m_i; }; template<typename ID, typename Container> ID find_uniq_id(Container const& m) { typename Container::const_iterator m_end = m.end(); for (ID new_id = 1; new_id <= ID_MAX; ++new_id) { if (std::find_if(m.begin(), m.end(), Compare<ID>(new_id)) == m_end) return new_id; } throw std::domain_error("new_id must not be beyond ID_MAX"); }
376 名前:375 mailto:sage [2008/11/08(土) 17:05:13 ] id_typeとget_idを特殊化することによってより流用できるようにしてみました 参照の参照が怖いのと面倒臭いのが難点だと思いました template<typename T> struct id_type { typedef typename T::id_t type; }; template<typename T> typename id_type<T>::type get_id(T const& x) { return x.id; } template<typename T> struct Comparator { typedef typename id_type<T>::type ID; typedef bool result_type; Comparator(ID i) : m_i(i) {} bool operator()(T const& i) const { return get_id<T>(i) == m_i; } private: ID m_i; }; template<typename ID, typename Container> ID find_uniq_id(Container const& m) { typename Container::const_iterator m_end = m.end(); for (ID new_id = 1; new_id <= ID_MAX; ++new_id) { if (std::find_if(m.begin(), m.end() , Comparator<typename Container::value_type>(new_id)) == m_end) return new_id; } throw std::domain_error("new_id must not be beyond ID_MAX"); }
377 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 17:39:34 ] これはひどい
378 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 18:08:48 ] なんというオナニー
379 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:37:20 ] 数値を文字列にするには ostringstream を使用する方法がメジャー?
380 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:39:59 ] >>379 たぶん sprintf を使う人のほうが多い。 snprintf が C++ 標準に入ればさらに増えるかもしれない。 結果を string で使うことや安全性を考えれば ostringstream のほうが良いとは思うけど。
381 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:54:15 ] sprintfはchar確保するの面倒だとおもうけど 利用者が多いのは何か理由があるの?
382 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:55:45 ] >>381 C からの移行組。
383 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:10:24 ] Exceptional C++ Style でstringstreamはsprintfに比べて だいたい10倍くらい遅いと書かれていた。
384 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:30:02 ] 速度的な点もあるけど printf系というのは非常に多くの言語で(Win32にはAPIもある)用意されていて 細部の違いはともかく、知っている人が多い、使い方を覚えて無駄にならない、 というのもある。 C++だけの世界だけで見れば型安全性の無さ等非難される面も多いし 「C++らしくない」という良くわからない理由で嫌う人も。 また、(よく知らない人に多いが)セキュリティ等の面で問題があると言い張る人も居る。
385 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:54:57 ] 書式の設定がめんどくさい上に、長くなってしまう気がするんだが俺の書き方悪いのかな
386 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 04:07:58 ] >>385 stream のことなら、たぶんそんなもん。 そういえば C++0x でもこの点は特に改善されたような話を聞かないな。 boost の io state saver ぐらいは入ってもよさそうなもんだと思うけど。
387 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 10:57:41 ] >>379 boost::lexical_cast を使うがよい 結局 stringstream 使ってるんだけどな
388 名前:デフォルトの名無しさん [2008/11/09(日) 11:53:14 ] >>381 char確保しなくてもいいよ。 std::string str; int a = 123; str.resize(256,0); sprintf((char*)str.c_str(), "%d", a); str = str.substr(0, str.find('\0'));
389 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:04:57 ] stringにconst_castか…
390 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:06:07 ] c_strの間違いw
391 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:23:41 ] >>388 c_str() の戻り値に無理やり書き込んでも反映されるとは限らんよ っていうかconst外して書き込むなんて無茶苦茶にもほどがある
392 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:24:08 ] #include <vector> #include <cstdio> #include <iostream> int main(int, char *[]) { std::vector<char> buf(0xff, 0); int n=10000; std::sprintf(&buf.front(), "%d", n); std::cout << static_cast<const char*>(&buf.front()) << std::endl; return 0; } なるへそ
393 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:27:03 ] printf系はセキュリティ面で問題あると思ってたが 問題ないの?
394 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:29:46 ] const外し か、漢だ!
395 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:30:56 ] nの型がintでlog10(n)が100や200にもなるアーキテクチャがあれば教えて欲しいものだ
396 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:41:02 ] string使おうがvector使おうが スタック上に領域確保してれば char配列となんら変わらん
397 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:46:24 ] >>396 大概はそうだが、規格には反するな
398 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:07:49 ] >>393 使い方の問題。 ユーザー入力をフォーマット文字列に使おうとする大バカと 最大文字数の指定方法を知らないバカがそう言ってるだけ。
399 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:18:32 ] >>398 具体的に何の関数を言ってるかわからんけど、 すくなくともsprintfはあぶない
400 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:28:49 ] 一般的にやるべきでないとされていることを「だって出来るじゃん」の一言でやってしまう・・・ くせぇーっ! DQN以下の臭いがぷんぷんしやがるぜぇーっ!
401 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:31:44 ] >>399 具体的にどこが危ないのか教えてよ 「使い方を間違えたら危ない」というレベルの話なら 「listen()を使う全てのプログラムは危ない」というのと同じになっちゃうから
402 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:39:40 ] >>401 え?最大文字数を指定できないじゃん それが危険だと思えないならまぁ好きにするといいよ
403 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:42:38 ] sprintfで100byteのバッファしか取っていないのに、 100文字以上有るかもしれないユーザ入力を与えるとかね。
404 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:44:11 ] VCのsprintf_s使ってます(^^)
405 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:46:22 ] ハア? char buff[100] sprintf(buff, "%.80s", user_input); これのどこが危ないって?
406 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:47:28 ] まさしく>>398 の最下行に書いてあるバカが言ってるとしか思えないんですけど。
407 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:48:08 ] C++ で何で sprintf なんて使ってるのん? しかも STL スレで・・・。 ostringstream か boost::format を使っとけ。
408 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:00:20 ] >>405 そういうことを分かって使う分にはいいけど、 実際に使う人間が必ずしも分かっているとは限らないし、 分かっていても、うっかりやってしまう危険性があるよね。
409 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:04:25 ] つうかそんな単純なケースならいいけど、 色々出力したりロケールが絡むと出力結果の予想がしんどいだろ
410 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:08:01 ] そんなレベルなら、「vectorで[]は使わないほうが良い。at()を使え。」と同じじゃないの。 特に>>399 はわざわざ>>398 に対して言ってるんだから もっとちゃんとした危険性を指摘してくれても良さそうなもんだけど。 そりゃ、切捨て前提という仕様は良くないとか 全部生かすつもりならsnprintfの方が楽だとか言うのはその通りだけど それとセキュリティ的な問題は全く別だから。 柔軟性だって例えば std::vecotr<char> buff; buff.resize(???); sprintf(&buff[0], "%.*s", buff.size()-1, str); のような使い方である程度確保できるし。 >>409 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。
411 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:13:43 ] >>410 > 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。 この一行が>>409 の話とは全く別の話なのは、そういうジョークなの?
412 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:33 ] ostreamが状態を持ってるのもしんどい
413 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:53 ] あ、別にユーザー文字列をそのまま配列に落とす場合に限らないよ。 そもそも(1箇所での)ユーザー入力なんて、普通は1つなんだから 例えば sprintf(filename, "file-%.80s%d.dat", input, num); のような形式でも、充分に最大値は予想できるし。 あ、「intが512bitの環境を考慮すると面倒」というのはその通りか。
414 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:17:55 ] 使い難さが有るということは、ミスり易いってことじゃね? ミスってもセキュリティ的な問題が出ないライブラリならいいんだけど。
415 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:19:43 ] いわゆる、バグというものは、ミスることによって起こるんだから。 十分予想出来るとかで大丈夫じゃないか、なんていい方出来るだったら、 世の中の全てのソフトウェアにはバグが無いってことも言えてしまう。
416 名前:409 mailto:sage [2008/11/09(日) 14:19:58 ] >>410 いやだから 出力結果の予想が困難→バッファ長の予想が困難 セキュリティ的にあぶなくね? という話し 気をつけて使え って話しなら そうですね としか言えないけど みなミスりがちだからsnprintfとかVC++のセキュア関数とか あるんじゃないの?
417 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:32:40 ] いやだから 全然>>398 への反論になってない。 「使い方を知らないのが問題」なだけでは 「セキュリティ的に問題がある」ということにはならないから。 まあ、416の言いたいことはもっともだし 他にもっと良い選択肢があるならそちらを使うべきなのは確か。 でも残念ながら標準ではない。 ただ、自分が「使い方を知らないバカ」だという自己紹介はもういいよ。 >>398 の最下行を無視して>>402 と反論するような人が>>399 みたいに書くわけだから。
418 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:35:28 ] あ、それと、「最大値の見積もりを間違える」点についてだけど 別に用意したバッファの95%以上まで使わなければいけない、というような決まりはないから。 多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。 例えば>>405 のようにね。
419 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:37:36 ] >多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。 ええええー
420 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:38:20 ] 最大量がきっちり分かってる状況じゃないかそれでいけるのは
421 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:41:24 ] は? 当然過ぎて困りますが ユーザー入力の部分の最大量は>>405 のように制限して その上で他の部分の見積もりが多少違っていても大丈夫なように ということですけど。
422 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:42:37 ] ユーザー入力の部分の最大値を制限するのは 当然というか大前提だと思っていましたが、皆さんは違うのですか。 認識の違いですね。
423 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:44:22 ] つまり、%fは使うなってことですね、判ります。
424 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:48:54 ] あー、sprintfは使い方が難しくセキュリティ的な問題を起こしやすいので使うべきではない。 とすると、 同じように、 使い方が難しくセキュリティ的な問題を起こしやすいものは使うべきではない ということになりますね。 つまり、 C++をやめましょう、と。 Javaあたりがよろしいでしょうか。 実際、世間の潮流もそういう流れになってますしね。
425 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:49:50 ] >>423 %.fを使ってください
426 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:52:52 ] >>425 sprintf(buf, "%10.0f", 1e100);
427 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:02:23 ] snprintf()なら、 snprintf(s, sizeof(s), … ってやっとけば安全だけど、 sprintf()は人間が数えないといけないじゃん。 >>405 見たいな単純なやつだったらどっちでもいいってことになるかもしれんけど、 書式が複雑になってくると、ミスる可能性がでてくるよ。 てか単純にsnprintf()のほうが楽ジャン。sprintf()で人間がバッファサイズ数えるなんて非合理。
428 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:04:36 ] いつまで STL スレで sprintf の話をやってんだよ。 そんな型安全じゃない C の糞遺物なんぞ C++ で使うな。
429 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:05:04 ] だよな!
430 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:32 ] >>426 printf("%.2u", -1); の時に必ず2桁に収まると思う人は居ませんね。 これと同様に最大桁数が見積もれる点は変わらないと思いますが。 いや、最大桁数はbit数に依存するので環境依存ですけど。 >>427 だからsnprintfはC++においては非標準だって。 それに「sprintfはセキュリティ的に問題がある」という意味にはならないよ。 「C++はセキュリティ的に問題がある」というのと同様。
431 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:47 ] ところで型安全って何ですか?
432 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:10:57 ] snprintfってC99からなんだっけ… 0xでは標準になるのかなぁ
433 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:12:10 ] なりません
434 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:13:40 ] 相変わらず話題の質が下がると賑わうな。
435 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:20:11 ] >>432 ドラフト N2798 の 17.1 [library.general] p9 より > This library also makes available the facilities of the C99 standard library, > suitably adjusted to ensure static type safety.
436 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:23:46 ] _scprintfで数えたらいい
437 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:28:25 ] >>430 doubleの最大桁数を常に見込んでバッファを確保するとでも? %fを使わずに、素直に%gを使えば済むじゃん。 そういう使いこなしを必要とするからsprintf()は難しいと言うなら判るが、 使いこなしてもいないのに語ろうとするな。
438 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:33:24 ] 結論:ostrstream or boost::lexical_cast or boost::format or boost::egg::to_string
439 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:00:48 ] 結論:いままで聞いた話を総合すると、一番スマートなのはこれ。 std::string str; int a = 123; str.resize(12); sprintf_s((char*)str.c_str(), str.size()-1, "%d", a); str.resize(str.find('\0')); ストリームとかで中間バッファを使うのはメモリの無駄だし、sprintfの書式指定能力の高さは最強。
440 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:02:21 ] >>439 その場合だとstr.size()は0が返るよ。 あと規格は大切にね。
441 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:03:16 ] >>その場合だとstr.size()は0が返るよ。 ごめん勘違いした。 でもその書き方は受け入れられない。
442 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:05:42 ] c_str()を出力バッファに使う男の人って
443 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:06:48 ] もはやSTLじゃねーなw
444 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:13:28 ] vectorを使えばかろうじてSTLに関する話題の範疇に入…らないか
445 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:17:17 ] >>439 × (char*)str.c_str() ○ &str[0] あと、せっかくだから sprintf_s() の戻り値使えよ。
446 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:30:07 ] >>445 規格ではstd::stringのメモリ上の連続性は保証されていない。 std::vectorと混同するな
447 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:33:39 ] どうせ大丈夫なんだから別に良いじゃん
448 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:35:47 ] 仕事で一緒にならないなら別にいいよ
449 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:38:17 ] >>446 C++0x で連続性は保証されるようになるし、 現状のどの実装でも連続性は成り立っている。
450 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:41:45 ] >>446 www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530 まぁ現時点で保証が無いというのは確かなんだけどね。
451 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 17:38:58 ] size_t count = _sctprintf(_T("%d"), 777) + 1; std::vector<TCHAR> buffer(count); _stprintf_s(&buffer[0], count, _T("%d"), 777);
452 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 17:52:09 ] TCHAR(笑)
453 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:42:07 ] >>449 そういう話をしたいのなら実装依存スレへ逝け
454 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:43:16 ] >>451 そういう話をしたいのなら実装依存スレへ逝け
455 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 19:54:23 ] STLのlistを利用したプログラムを実行中、 "list iterators incompatible" という例外が発生しました。これはどういったエラーでしょうか? 開発環境はVisualStudio2005 AcademicEditionです。
456 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:01:13 ] ソース晒せ
457 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:06:15 ] transformの使い方に関して質問があります。環境はGCCです。 目的は、stringの中身をすべて小文字に変換したいのです。 #include <string> #include <algorithm> #include <cctype> #include <cstdio> #include <iostream> string aa = "AbCdEfG"; transform(aa.begin(),aa.end(),aa.begin(),tolower) で、aaの中身をすべて小文字に変換できません。 理由はわかりますでしょうか?
458 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:10:50 ] >>457 とりあえずコンパイルエラーだろ。 エラーの意味がわからんということならエラーメッセージ晒せ。
459 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:14:20 ] 俺の環境では全部小文字になるが・・・。
460 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:20:44 ] 使用したソース #include <string> #include <algorithm> #include <cctype> #include <cstdio> #include <iostream> using namespace std; int main(){ string aa = "AbCdEfG"; transform(aa.begin(),aa.end(),aa.begin(),tolower); } 以下がコンパイルエラー test.cpp: In function 'int main()': test.cpp:9: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits\ <char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> \ > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded f\ unction type>)' よろしくどうぞおねがいします。
461 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:23:26 ] >456 ttp://www.hsjp.net/upload/src/up51891.txt 本来の拡張子は.hppです。ごちゃごちゃしててすみません。 103行目のupdate_etc()関数が怪しいと思っているのですが…
462 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:24:53 ] Effective STL に乗ってたネタかな