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 以降
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 に乗ってたネタかな
463 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:32:13 ] >>457 たぶん、こういう関数オブジェクトを作ってそれを渡せばいいよ。 struct my_tolower : std::unary_function<char, char> { char operator ()(char c) const { return std::tolower(c); } };
464 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:54:01 ] transform(aa.begin(), aa.end(), aa.begin(), static_cast<int(*)(int)>(tolower)); 通った typeof(aa)::value_type : char tolower : int(*)(int) でtolowerをchar(*)(char)と型推論しようとして失敗してる なので正確にキャストして与えてやればおk?
465 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:57:12 ] >>461 まずはデバッガのバックトレースを見たりブレークポイントつかったりしてあたりつければいいよ segvだろうが、unhandled exceptionだろうがどこで発生したか分かるから
466 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:00:18 ] >>464 >>460 の最後の行の中にunresolved overloaded function typeってのがあるでしょ。 C++では、tolowerが多重定義されているのだが、 それではテンプレート引数の型が決定できないということでエラーになる。 だから、>>464 のようにキャストが必要になる。>>463 みたいに他の方法も考えられる。
467 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:06:27 ] >>466 >>464 >>460 ありがとうございます。 なるほどよく分かりました!
468 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:21:38 ] >465 ありがとうございます。とりあえずどこで投げてるのか絞り込んでみます。 ただ、list iterators incompatibleというのがどういう状態を指すのか、よくわからないのです。
469 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:37:51 ] vcのstlのincludeディレクトリにて"list iterators incompatible"で全文検索するとか
470 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 22:01:54 ] >469 そういう方法もあるのですね listの中を覗いてみます。 ありがとうございます
471 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 11:38:03 ] dequeにpush_backで要素を挿入していくのは、予め配列をサイズ決め打ちで宣言して代入していくのより遅いですか?
472 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:13:18 ] >>471 速度は実測が基本。 一般的に、 push_back() を繰り返す場合、配列要素のメモリ確保回数が増えるので 遅くなる可能性が高くて、それでも push_back() ならコピーコンストラクタが使われるので 要素の型によっては代入に比べて速い可能性もある。
473 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 20:00:12 ] 気になるけど図るのが面倒臭いなら、reserveしておけば精神的に気が和らぐ。
474 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:12:15 ] vectorならreserveは必須だと思う dequeってどうだろう
475 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:21:59 ] dequeはある一定の長さのブロックが不連続に確保されるそうだから reserveしたらシステムからメモリを持ってくる時間は稼げるけどvector と違ってメモリの再配置は起きにくいんだよね
476 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 23:24:27 ] それは実装によるんでは。
477 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 23:32:37 ] 実装によるのはもちろんだが一般的な実装の話ね
478 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 01:13:27 ] dequeのpush_backが(償却じゃなくて正真正銘の)定数時間であることは規格で要求されてたはず だから一概に実装に依るとも言えない
479 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 07:48:57 ] dequeはpush_back/push_frontで既存要素のコピーが起こりえないのがありがたい まあ最初から要素数が判ってるならvector一択だけど
480 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:37:08 ] STLのことは良く分からないけど、 list,stack,queue,vector,dequeで空のクラスSampleのポインタを、 10万個格納、(1個delete&削除・1個格納)*10万回、 空になるまでdelete&要素削除 してみた。 vectorは予め追加要素の2倍reserve()した。 要素の追加削除はvector,stack以外『古い物から削除』、前から取り出して後ろから追加でやった。 stack、queueはそれぞれコンテナdequeを利用。 list 68.11 秒 vector 20.344 秒 stack 27.5 秒 deque 9.468 秒 queue 9.438 秒 queueが速すぎてワロタ dequeは操作する方向次第でstackとほぼ同等 queue,stack,dequeはこの場合、実質同じモノだし queue,stackのコンテナを変えたら悲惨な結果になった PCが悲鳴を上げたのでこれ以上のテスト回数は勘弁
481 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:41:18 ] あぁ、次はboost::circular_bufferだ…
482 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:58:12 ] >481 >480と同条件、上限20万個として計測してみた。 平均5.5秒くらいだった
483 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 23:21:57 ] ひょっとしてlistってあんまり使わない方が良い?
484 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 23:51:07 ] むしろ連結リストのくせに良い数字が出てると思うがね
485 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:18:06 ] リンクリストより配列のほうがキャッシュに引っかかりやすいからいいぞってMSも言いている。 msdn.microsoft.com/ja-jp/library/eye126ky.aspx
486 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:33:54 ] >>483 状況次第 listのほうが向いてる使い方もあるしね
487 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:54:30 ] 途中(先頭末尾以外)の要素の削除はlistじゃないとやってられんやろー
488 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:55:31 ] あとリストの連結やリストの分割もあるか あれ?そんなことできたっけ・・・?
489 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:01:03 ] とりあえずただデータを突っ込んで置きたい(出し入れ順番とかどうでも良い)場合には、 リストは不向きってことか
490 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:14:52 ] 昔はやたらとリンクリストを使うのがいいとされていたが、 今のご時世でも初心者にリンクリストを教えたがる間抜けが後を絶たない。 普通にstd::vectorを使えるように仕込んでおけば、std::listを使うのも苦労はないだろうに。
491 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:15:39 ] >>487 途中の削除もdequeは結構速い。 listは削除してもイテレータが無効にならないのが利点かな。
492 名前:1/2 mailto:sage [2008/11/14(金) 15:46:52 ] listを使っていてよく分からない事態に遭遇したので質問します。 長くなってしまったので申し訳ありませんが分割投稿します。 環境:VC++2005 / XP typedef struct globalArray { int type; char name[100]; float variable[5][5]; } globalVar; typedef struct nodeDat { CShaderNode *nodeKind; globalVar varDat[5]; // 上の構造体(globalVar) int dataNum; float power; } nodeData; typedef struct _data { nodeData mainNode; // 上の構造体(nodeData) nodeData blendNode; // 上の構造体(nodeData) nodeData subNode; // 上の構造体(nodeData) int materialNum; dxMaterial *matrials[MAX_MATNUMBER]; } dataBlock;
493 名前:2/2 mailto:sage [2008/11/14(金) 15:47:25 ] 上のような構造体が有りまして、一番下のdataBlockをリストとして扱っているのですが、 dataBlock tmp; /* 〜 データ作成処理 〜 */ /* 〜 挿入先探索 〜 */ insert(itr,tmp); とデータを挿入してリストを覗くと途中までしか正しくデータが入っていません。 データ作成過程で"",NULL,0.0fと全て初期値を用いてデータを初期化しているのですが、 data[0]->mainNode.varDat[0].variable 以降のデータが未初期化のまま生成されています。 構造体を入れ子にする前は正しく動いていたのですが、 listを扱う際は構造体を入れ子で扱うとNG等の制約があるのでしょうか。 ご教授お願いいたします。
494 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 15:53:19 ] それだけだと推測しかできん ・初期化の部分が不完全か ・未初期化というのが勘違いか ・リスト操作がバグってるか のいずれかしかないが、心当たりがないなら何か見逃してるんだろう そのようなNG的制約は無いので大丈夫
495 名前:492 mailto:sage [2008/11/14(金) 16:04:13 ] 返信ありがとう御座います。 (※(int)はキャストではなく型を説明上明示するために便宜的につけた物です。紛らわしくてすみません。) 例えば仮データ(tmp)で、 (int)materialNumを0で初期化したのがリストのデータでは (int)materialNumが-33686019になってしまっているので、 >・リスト操作がバグってる のでしょうかね…… ありがとうございます。制約は無いときいて安心しました。 もう少し追ってみます。
496 名前:492 mailto:sage [2008/11/14(金) 16:30:43 ] 連投失礼いたします。 色々弄ってみたところ、構造体のメンバの記述順を入れ替えると正確に入るデータと入らないデータが出てきました。 詳しく調べたところ、連結しようとしている構造体は180byteで、リストで正しく入るのは96byteの領域まででした。 数字的にこれって多分仕様ですよねぇ……
497 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 18:55:54 ] -33686019ってことは0xfdだろ? ちゃんとdeep-copyせんと。
498 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 19:59:55 ] dataBlock tmpA; /* 〜 データ作成処理 〜 */ dataBlock tmpB; tmpB = tmpA; ってやって、tmpAとtmpBは同じ内容の独立したオブジェクトになる?
499 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 20:04:28 ] 誰にもわかりません
500 名前:492 mailto:sage [2008/11/14(金) 21:01:27 ] 返信ありがとう御座います。 >>498 さんのを実行してみたところ、同内容の独立したオブジェクトに成りました。 deep-copyなのですが、 /* 〜データ作成処理〜 */ を抜けた後、tmpに全ての値がきちんと入っていることを確認し、 data.insert(itr,tmp); でインサートを行っているのですがコピーに関してはlist側で処理されている様で、 こちら側からコピー処理を定義することが出来るのでしょうか。
501 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 21:50:22 ] >>500 コピー演算子をオーバーロード。
502 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 00:35:09 ] その場合はコピーコンストラクタじゃ?
503 名前:492 mailto:sage [2008/11/15(土) 01:20:38 ] すみません、何かもう全く関係ないところが原因っぽいです。 構造体のメモリ領域と他のクラスのメモリ領域が被ってる……
504 名前:デフォルトの名無しさん [2008/11/15(土) 03:13:32 ] あるIDを割り当てるクラスを作成しようと思っています インターフェースとしてはこんなかんじで class IDAllocator{ uint32_t T AllocID(); void FreeID(uint32_t id); }; クライアントコードに対して、一意なIDを割り当てるのですが、 IDを使い終わった後は返却し、後ほど再利用できる様にしたいです。 IDを割り当てる際に、現在使われてないIDの内、最小の数値のIDを返す仕様にしたいのですが、 STL的にかっちょいい実装方法を教えてください 今のところ割り当て済みのIDをvectorに記録しておいて、0から1ずつ増やしてvectorに無いIDがあれば それを使うというどう考えても効率の悪いやり方でやっています
505 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 03:44:37 ] 使い終わって返却されたIDをpriority_queueに記録し、再利用するときはそこから取り出す
506 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 03:48:12 ] priority_queueが空なら新たに生成する→新しいIDは最も大きい数値になる ってことか
507 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 09:29:56 ] インテレータの有効性をチェックする方法はない? 何も代入されてないときなど、別の変数でフラグ保持するのは面倒だと思うので
508 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 09:59:37 ] とりあえずend()でも入れとけとか、 有効/無効状態をチェックするなとか、 そもそもインテレータって何とか。
509 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 14:38:28 ] そんなあなたにboost::optional
510 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:05:27 ] >488 splice 使えばできるはず。
511 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:53:37 ] これっておかしくない? ttp://www.geocities.jp/ky_webid/cpp/library/008.html
512 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:57:21 ] >>511 どこがどうおかしいと思うのか書けやカス
513 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 11:21:20 ] とりあえずテンプレートクラスはクラステンプレート
514 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:11:13 ] enumの値か?
515 名前:デフォルトの名無しさん [2008/11/16(日) 12:14:51 ] それは別に間違ってなくね
516 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:16:41 ] MIRROR_X
517 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:24:52 ] 問題ないだろ MIRROR_X = SCALE | ROTATE を意図して書いてあるならな。
518 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:35:10 ] はー?
519 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:50:45 ] enum bitset 二大不要物(笑)
520 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:54:39 ] enumを不要とか言うやつは素人
521 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:04:54 ] enum要らないとか言う奴はただのバカかTMPしない人だろ
522 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:08:23 ] >C言語であれば、ANDやOR等の演算を使って管理しますが、C++ではbitsetが利用できます。 この辺りで馬鹿を晒している。このサイトも勿論、私のダメサイトリストに載っている。
523 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:10:34 ] じゃぁbitsetってなんに使うの?
524 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:13:37 ] ビット単位のフラグの管理をせざるを得ないときに使うかなぁ。ま、そのときが来たら考えるよ。
525 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:16:23 ] >>522 上級者のあなたがおすすめするサイトを教えてください
526 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:20:55 ] >>523 >>519
527 名前:522 mailto:sage [2008/11/16(日) 13:23:15 ] 残念ながら今のところ、初心者に安心してお勧めでキルサイトは見つけていない。 したがって、申し訳ないが期待には応えられない。 ちなみに、私のダメサイトリストは正しくは、「初心者にはお勧めできない(≒ダメ)サイトリスト」だ。 中級者辺りが読む分には、(自力で確認できるノウハウもあるだろうから)まぁ、悪くないかもしれない。
528 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:34:14 ] enumは型安全じゃないのが気に要らないな
529 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:35:07 ] C++のenumは、|=するだけでキャストが必要な糞仕様
530 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:44:26 ] 俺は#define派 enumだとアセンブラソースから使えないから
531 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:54:37 ] >>529 そもそもビットフラグで使うとは限らないわけで…
532 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 14:08:21 ] >>519 unionに失礼だろw
533 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 16:05:41 ] それは128ビットとかに使うぞ
534 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 09:37:02 ] お前らみんな、unionさんに謝れ!
535 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:37:45 ] アマチュアの俺からすると分からんのだけど、unionって実際の業務で使われてるの? enumなんかは割りと使ってるんだけど
536 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:48:34 ] >>535 使うこともあるよ。Cでbitsetもどきを実装するときとか。
537 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 17:54:37 ] 大きな数値から上位ビットと下位ビット分けたり
538 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:04:00 ] ・建前 unionは環境に激しく依存するから、使わない方がいい。 ・本音 いまどきビッグエンディアンとか無いだろw
539 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:11:15 ] オレも、エンディアン、ビット幅、signedの右シフト、除算の符号は実装決めうちで作ってる
540 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:14:14 ] >>538 サーバ系では未だにSunが頑張っているから無視できないのよね。
541 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:33:05 ] うにおんは組み込みCで以前使ってた事がある おそらく今でも使ってる
542 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:45:55 ] 1の補数はもう絶滅でいいだろ
543 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:50:13 ] 引き算どうすんだよw
544 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:59:06 ] 負数の表現方法のことだろ。
545 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 19:17:14 ] それは2の補数
546 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 19:19:57 ] ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE
547 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:16:38 ] よその言語だとASCIIにIEEE754も決め打ちと化しているものもあるよな。
548 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:10:13 ] 未だにIBMのサーバでEBCDICとかあるから油断できない
549 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:51:08 ] >>538 俺はエンディアン入れ替えたいからunion使ってる。 union { double a; char b[8]; }
550 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:54:30 ] つーかネットワークバイトオーダはbigだし 画像処理でもエンディアン入れ替えなんてよくやるでしょ 全部littleで済むと思ってる人ってどういう世界に生きてるんだ?
551 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:08:27 ] 意識する場面なんてほとんどないな
552 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:11:46 ] >>550 そういうときに、必ずエンディアン変換を挟むコードを書いてしまう(あるいは書かない) というのがエンディアン決め打ちのコーディングだと思う。
553 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:14:19 ] #ifdefるだろjk
554 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:41:30 ] いや、自動判断する。 例えばtiffはヘッダのIかMかで判断できるし、実行環境がどっちなのかはint foo = 0とでもして& fooをchar *にキャストして取り出せば判る。
555 名前:554 mailto:sage [2008/11/18(火) 00:51:28 ] s/int foo = 0/int foo = 1/ まぁ、unionは使わないけれど。
556 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:53:15 ] スレから脱線するが、標準の方法でエンディアンをコンパイル時に知る方法ってある? 実行時ならできるんだが
557 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:58:32 ] boost/detail/endian.hppとかを見る限り、標準では無さそうだね
558 名前:デフォルトの名無しさん mailto:わざとだが sage [2008/11/18(火) 01:50:26 ] >>556 コンパイル環境のエンディアンを? それとも、ターゲット環境?
559 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 01:58:09 ] >>556 VxWorksなら_BYTE_ORDERのdefine見れば分かるが他はしらん。
560 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 13:28:05 ] >>554 PDP-11位だしな変態なの
561 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 14:44:19 ] >>560 お前はSun、IBM、MIPSを敵に回した。
562 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:25:22 ] vectorについてですが array.reserve(array.size()); でぴったりのサイズに変わるかと思ったのですが変わりません。 大きなデータを扱ったりする場合、ぴったりのサイズで作り直した方が メモリが節約できるかと思うのですが、なぜうまくいかないのでしょうか。 何かいい方法はないでしょうか?
563 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:28:10 ] vector<T>(array).swap(array);
564 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:32:01 ] reserveは拡大する方向にしか働かないのでは
565 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:36:13 ] >>>562 §23.2.4.2.2 void reserve(size_type n); 2 Effects: A directive that informs a vector of a planned change in size, so that it can manage the storage allocation accordingly. After reserve(), capacity() is greater or equal to the argument of reserve if reallocation happens; and equal to the previous value of capacity() otherwise. Reallocation happens at this point if and only if the current capacity is less than the argument of reserve(). 3 Complexity: It does not change the size of the sequence and takes at most linear time in the size of the sequence. greater or qrual と書いてあるから等しいかもしくは大きいとなるので ぴったりのsize()になる保証はない。
566 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:37:52 ] おっと equal to the previous value of capacity() otherwise. ともあるから、縮小しようとしてもcapacity()は変化しない事になる。 詰まるところ>>563 のようにスワップ技法に頼るしかない。
567 名前:562 mailto:sage [2008/11/20(木) 11:20:10 ] >>563-566 出来ました。ありがとうございます。 サイズの縮小は出来ないんですね。勉強になりました
568 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:13:58 ] 今までイテレータが指してるコンテナのことをイテランドと呼んでたんですが そんなの聞いたことないって言われました ぐぐってもほとんど出てこないので不安になってきたんですが(「イテランド」だとゼロ…) 普通に使いますよね?
569 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:17:07 ] はつみみです
570 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:18:50 ] ぐぐった時点で気づいてるだろwwww俺は聞いたこと無いな iterandにしたら多少出てくるけど、まぁスズメの涙ね
571 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:24:17 ] あーやっぱり? iterandは1000件くらい引っかかるから、わざわざカタカナにしないだけで あっちでは普通の言葉かもしれないと思ってたんですが じゃあ皆さんはイテレータが指してるコンテナのことはなんて呼んでるんでしょう 「イテレータが指してるコンテナ」ですか?
572 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:24:23 ] イテレータが指してるコンテナ? vector<int>::iterator it; だと vectorが「イテランド」になんの?
573 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:27:10 ] 例えば vector<int> v; vector<int>::iterator it = v.begin(); なら、itはvのイテレータで、vはitのイテランドです
574 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:38:03 ] iterateeとか言ってみる。
575 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:09:59 ] Pythonではiterable
576 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:40:26 ] >>575 それは意味が全然違う
577 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:50:39 ] iterable はまんまイテレータ(とみなせるもの)。
578 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:37:36 ] itのコンテナ 程度にしか言わないな
579 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:54:20 ] イテランドがまあ、何を指している言葉かは オペレータ⇔オペランド からの類推でわかるけどさ。 それより世間一般ではイテレータなんだろうが、 俺はついついイタレータと読み書きしてしまう今日この頃。
580 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:15:51 ] >>579 おいたが過ぎますぞ
581 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:24:11 ] いてまうどー
582 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:52:19 ] とりあえず、イテランドがあんまり一般的な言葉じゃないことはよくわかりました 内輪以外では使うのを控えることにします ありがとうございました
583 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:05:31 ] あんまりという表現なのか・・・w
584 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:41:16 ] つうかどこでその言葉を習ったんだろ
585 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:27:41 ] イテランドでぐぐるとこのスレが引っかかるなw
586 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:47:04 ] イテランドたんのアニメ化が決定したそうです。
587 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 16:56:13 ] とある言語の被反復構造(イテランド)
588 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:09:09 ] パパ〜遊園地いきたーい よーし家族みんなでイテランドにでもいくか〜
589 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:16:39 ] 井手ランド
590 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:32:30 ] とある要素の列挙目録(イテレータ)
591 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:46:29 ] イテランドたんの要素数は103000ですね、わかります。
592 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 18:29:32 ] 変数 X が std::list 型で変数 I がその reverse_iterator だとすると X.erase( I.base() ); で I が示す要素の隣を消去するので I はまだ使えますよね。 VC8 で I を使うと assert で止まるんですけど。
593 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 18:55:16 ] その1行だけ示されてもなあ。
594 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:24:06 ] デバッガで追えばいいじゃん……
595 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:29:51 ] string strに入っている文字列のi番目から後ろをstr2に代入するにはどうすればいいですか?
596 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:56:15 ] str2 = str.substr(i);
597 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:57:28 ] substr
598 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 20:06:38 ] >>592 使えない
599 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 20:25:38 ] 595です。ありがとうございました。あとstringを==で比較するときに小文字と大文字を区別しな方法はありますか? 一度変換しないとだめでしょうか?
600 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:06:58 ] stringはそもそも「大文字と小文字」っていう概念が無いと思う
601 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:10:43 ] 大文字だの小文字だのは真面目にやり出すと大変だぞ ロケールの問題とか
602 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:19:34 ] >>598 std::list の reverse_iterator の場合は1つ後の要素を消去したとき無効になるんですね。
603 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:23:31 ] stringは複雑なんですね・・・わかりました
604 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:30:16 ] 複雑なのはstringではなく、真の国際化です
605 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:51:06 ] "ガ"と"ガ"を==で比較してtrueにできないからstd::stringはクソ
606 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:54:04 ] CLでいうところのequalpを手前で実装しろクソ
607 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:58:17 ] @と`を同じ文字と解釈するべき環境とかあるからな
608 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:59:34 ] 7bit ASCII内での大文字小文字無視なら、char_traits自作でやる実装を何かの本で見た。
609 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:03:38 ] typedef pair<double,string> HOGE; void func(??){ HOGE p; p.first = data; p.second = chordname; pairs.push_back(p); } int main(){ deque<HOGE> pairs; for(){ func(); } } mainで作ったdequeにfunc関数で値を入れたいんですがどうしたらいいですか? もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。
610 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:04:09 ] 引数
611 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:11:52 ] 引数なのはわかるんですが・・・ void func(deque<HOGE> &pairs){ } main(){ func(pairs); } こうですかね?
612 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:15:07 ] >もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。 むちゃくちゃだ。
613 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:20:12 ] えっと具体的にどうおかしいですか?
614 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:22:48 ] 頭がおかしい
615 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:35:40 ] mainのスコープを抜ける=プログラムが終わる プログラムが終わった後にdequeが初期化されるって、 atexit内で初期化したいのか
616 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 23:14:48 ] >>615 ちょっと表現を間違えました。
617 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 23:44:46 ] えっとそれで611で大丈夫ですかね?
618 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:42:48 ] private な vector<int> hoge を外部から走査して数値を得たい const int *mage = &hoge; のような方法でするのかな?と思ったんですが セオリーな方法はどんな書き方なんでしょうか
619 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:45:27 ] 参照せずに値じゃね?
620 名前:618 mailto:sage [2008/11/23(日) 00:45:59 ] いやいまいちお前がなにいってんのかわかんないけど
621 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:47:43 ] hogeをスキャンして数値を返すメソッドを公開すればいいじゃない
622 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:52:10 ] プレイベートなデータなので、捜査には礼状が必要です。
623 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:53:45 ] vectorの中身は連続性が保証されている、 つまりprivateなvectorの、先頭アドレスを返すような関数作って それをconst int * で受け取り(もちろんサイズも)、 そのconst int * を走査するのかな?と思ったけど 書き方がわかんないから>>618 になってしまった ゴメンナサイ(´・ω・`)
624 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:58:23 ] beginとendのペアを返す
625 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:02:01 ] >>621 に一票
626 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:09:49 ] >>621 スキャンって・・・? 丸ごとコピーしてそれを返す? 内部でiterator保持して呼び出す毎に進める? 現場の人じゃないから、その手の語彙力ないんだわ(´・ω・`) ちなみに具体的にはintではなく x,y座標が入ってるpair<int,int>で これを取得してGUIでリアルタイムに線を引きたい という状況です
627 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:23:53 ] 現場の人とか関係ねーw >>618 の走査 == >>621 のスキャン だろOKJK それから情報後出しって嫌われるの知らないかね いいから黙ってソースコードべたっと貼れ
628 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:27:26 ] では俺はコールバックを提案しよう。
629 名前:618 mailto:sage [2008/11/23(日) 02:19:18 ] >>627 GUIライブラリ使ってる上に携帯厨なんです(ノ∀`) typedef std::pair<int,int> Pos class Hoge{ public: const Pos *getPosArray(int *arraySize); private: std::vector<Pos> p; }; const Pos *Hoge::getPosArray(int *arraySize){ *arraySize = p.size(); return *arraySize ? &p[0] : 0; } こうしてみた コーディングスタイル云々は勘弁してつかーさい
630 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 02:28:25 ] const std::vector<Pos>& ppp() const { return p; } でいいじゃん
631 名前:デフォルトの名無しさん [2008/11/23(日) 14:43:29 ] int function(string &buff){ } main(){ string buff: function(buff); } mainで宣言したstringに関数で値を入れるには、これであってます?
632 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:45:30 ] >>631 いいよ。
633 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:50:04 ] ありがとうございます。 functionでの代入時は buff ="mozi"; みたいな感じでいいですか?
634 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:51:30 ] 俺ルールだと、関数で値を入れる場合はポインタ渡しにして、 単に値を渡すだけなら参照にしてるな。
635 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:56:47 ] >>633 それでいいよ。 値を渡すだけでも、返してもらうときでも参照でいいよ。 const のあるなしで区別すればOK
636 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:57:54 ] >>634 M$ なんかが当初そういう方針だった気がするな。 NULL チェックが必要になるから個人的には微妙なんだが・・・。
637 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 16:31:25 ] >>635 賛成。 それとは別に、俺は std::string 程度なら値を返すようにしたい。 function().length() したいだけだったり、function() で代入したものを他の関数に渡したいだけだったりした時に、わざわざローカル変数を作らなければならないから。 また、ローカル変数に代入すべき場合のうちで初期化後に変更しないものに const を付けられなくなるから。 オーバーロードして両方のバージョンを用意すればいいだけだけど。
638 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:27:34 ] >>635 こうしろと? int& function(string &buff){
639 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:28:40 ] >>638 いや、引数の話だよ。
640 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:58:24 ] >>635 int function(int&, double& )とかした場合 function( 1, 0.1) は使えないだろ こんな使い方禁止?
641 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:05:30 ] >>640 直前のカキコとか見れよ。 引数で値を返してもらいたいとき、constなしの参照つかえって意味だから、 そういう使い方は意味ないだろ。
642 名前:デフォルトの名無しさん [2008/11/24(月) 19:24:39 ] istreamから数バイトずつ読み取って意味解釈していくような プログラムを作っているのですが、 istream input; short header1; input.read(&header1, sizeof(header1)); short header2; input.read(&header2, sizeof(header2)); こんな感じでしか書けないのでしょうか? short header1 = input.read(sizeof(header1)); short header2 = input.read(sizeof(header2)); などと書ければよいのですが・・
643 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 19:27:10 ] >>642 read<short>(input) とかいう関数でも作れば良いんじゃない?
644 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:13:34 ] >>642 short header1, header2; if(input >> header1 >> header2) { // ... }
645 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:26:01 ] >>644 そんな餌に(AAry
646 名前:642 mailto:sage [2008/11/25(火) 01:57:17 ] >>643 こんなのを作ってみました。 template<class T> std::istream& read(std::istream& is, T& data) { return is.read(reinterpret_cast<char*>(&data), sizeof(T)); } >>644 それって、inputが文字列なら良いですが、 バイナリ読みしたい場合はダメですよね?
647 名前:デフォルトの名無しさん [2008/11/25(火) 16:50:03 ] vectorのイテレータは足し算ができるのに、listのイテレータではできないんですね。 listで添え字アクセスのようなことをやる場合は、 list<int>::iterator it = list.begin(); for(size_t i= 0; i< index; i++ ) it++; みたいなことをやらないといけないの? 挿入とか削除とかが多い配列なのでvectorよりlistを使った方がいいんですが、 indexを使ったアクセスも多いので、なんかブサイクですね。 いい方法ないですか?
648 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:55:04 ] >>647 コンテナの種類とランダムアクセスイテレータに関して も少し理解を深めといた方が。
649 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:57:49 ] >>647 std::advance()
650 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:16:49 ] >>648 ランダムアクセスをしたいならvectorを使うべきだと? 一般論ではそうでしょう。 しかし、 vectorの場合、挿入・削除におけるコストは配列要素の数が増えるに従って等差級数的に増大します。 listの場合は配列要素の数にかかわらずコストは一定です。 だから、配列要素の数と、挿入・削除・ランダムアクセスの頻度を考えて、 処理速度的に最適なものを選びたいと思っています。 それで私のケースではvectorよりlistが妥当だと判断した訳ですが、ソースの記述がブサイクだと言ったまでです。 >>649 listの要素の入れ替えをしたくはないのです。
651 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:22:20 ] >>650 つdeque ランダムアクセスできて挿入も速い
652 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:26:38 ] >>651 私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。
653 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:41:22 ] >>652 dequeは途中の挿入も(そこそこ)速いんだよ。 dequeの仕様を満たそうとすると、どうしてもそういう実装になる。
654 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:02:08 ] >>650 要件がいまいちつかめないので何ともいえないけど、 規格を眺めてlistが最適だと思うなら仕方がないんじゃない? listはランダムアクセス出来ないしね。 でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ
655 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:14:47 ] >>652 要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ
656 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:39:03 ] 周りがアドバイスしても結局自分の方法に固執するんじゃ 何言っても意味ないよ そういうのはほっとくに限る
657 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:44:27 ] 挿入/削除が多いならリストを使うべきだろ ときどきランダムアクセスが必要ならstd::advanceで
658 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:51:51 ] advanceを思いっきり勘違いしてる節があるよね
659 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:58:49 ] >>655 配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。 VS2005でコンパイルした場合だけど。
660 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:05:31 ] >>659 何が?
661 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:28:06 ] 用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな STLにはないけど
662 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:31:05 ] >>647 より後の返答カキコ 本当に>>647 なのか? おまえら、誰かに釣られてないか? IDのない板って、なりすまし可能だからな
663 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:35:42 ] 質問に答えてるだけなんだから、>>647 と>>650 が同一人物であろうとなかろうと何も関係ない 釣りだったとしても痛くも痒くもない
664 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:03:28 ] std::vector<要素 *>
665 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:30:10 ] skip listか んなもんわざわざ使うなら普通にlistでもいいと思うけどな
666 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:40:43 ] setについて質問です www5c.biglobe.ne.jp/~ecb/cpp/07_15.html 要素の追加(追加場所をイタレーターで指定) 定数時間 とありますが、追加場所をイタレーターで指定とはどういうことですか? insert関数ではないですよね?
667 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:02:51 ] >>647 はlistを使うのを前提として質問していて listの代わりに何が良いかは質問してないようによめるのだが
668 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:04:52 ] >>666 insertのことだと思うが
669 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:11:14 ] >>666 setにはイテレータを指定するinsertと指定しないinsertがあるよ
670 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:15:27 ] vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので クラスのポインタを入れて使おうかと思ってるのですが 何か注意しなければ行けない点はありますか?
671 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:17:35 ] >>670 ないです。
672 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:18:02 ] あります vectorから取り除いたときのdeleteし忘れ
673 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:20:48 ] >>670 オブジェクトの多重参照
674 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:54:32 ] FUGAはduobleとstringのpairです multiset<FUGA> huga; にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか? count関数がありますけど使い方が・・・ huga.count("hogehoge");みたいな感じで使いたいんです
675 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 22:04:16 ] >>674 count_if()
676 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:21:30 ] >>671-673 サンクス deleteしなきゃだったんだな ありがとう
677 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:50:01 ] >>670 ptr_vectorでも使えば
678 名前:デフォルトの名無しさん [2008/11/26(水) 11:06:22 ] KOUZOUTAI data[100]; partial_sort( data, data + 10 ,data+100, Sortpred1) ってできますけど vector<KOUZOUTAI> data(size); partial_sort( data.begin(), data + 10 ,data.end(), Sortpred1) ができません。第2引数の書き方が問題だと思うんですが、どう書けばいいでしょうか?
679 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 11:18:38 ] >>678 data.begin() + 10
680 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 12:37:31 ] const_iterator を iterator に変換するために distance() と advance() を使う方法が Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で 変換できません。 std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?
681 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:34:21 ] typedef std::set<A,B> C std::set<C::const_iterator,C::iterator> を作って変換しろ
682 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:46:58 ] >>681 std::set, std::map の検索は普通の実装で対数時間
683 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 18:49:39 ] *reinterpret_cast<std::set<A>::iterator*>(&cit) 大体の実装なら通るよ 細かいこと気にすんなってwwwww
684 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 20:24:23 ] 対数時間なら別にいいんじゃね
685 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:02:08 ] >>680 とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?
686 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:35:37 ] >>680 定数時間にこだわるんならどうぞ std::tr1::unordered_map<C::const_iterator, C::iterator>
687 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:23:23 ] vector<vector<T> > WArray; WArray warr (100, vector<T>(10)); T型の2次元配列を作る場合、このようにすることが多いのだけど 全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ を知りたい場合、方法は無いのでしょうか?
688 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:44:30 ] > 全体のデータサイズは、size_of()関数で取得できるけど、 できるか?
689 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:57:26 ] >>688 >>687 です ごめんなさい、間違えました size_t size = warr.size(); こうでしたね(^^;
690 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:29:30 ] いや、それ全体じゃないから。
691 名前:デフォルトの名無しさん [2008/11/30(日) 17:38:11 ] detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?
692 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 17:41:32 ] マルチ市ね
693 名前:デフォルトの名無しさん [2008/11/30(日) 17:45:42 ] detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdb' が 'C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)\Lib\detours.lib'に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。これの意味と解決方教えてください
694 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 18:34:07 ] さっさとしね
695 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:02:34 ] 大体わかるけどマルチ野郎には絶対教えない
696 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:08:26 ] こんなファイルがあって、 -- a foo FOO a fooz FOOZ a foz FOZ b bar BAR b baar BAAR -- その場合、こんな関係を現わしているんだけど、 -- a-+-foo +-fooz +-foz b-+-bar +-baar -- どんなデータ構造にするのが手頃か相談に乗ってくれまいか。
697 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:17:04 ] 何やりたいかによるだろうが、単に vector vector ではだめなの?
698 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:26:09 ] aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、 aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。 おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。
699 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:31:12 ] mapでいいだろ
700 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:32:12 ] 楽しようと思えばmap<string,map<string, string> >かなぁ
701 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:51:58 ] >>698 なんかよくわからんが、vector<pair<>> を含む class を作れば いいのかな。出力もメンバ関数でもできるし。
702 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:17:48 ] multimap<string,pair<string,string>>とかかな・・・ S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR"))) みたいなのを表現したいってことなら
703 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:34:40 ] struct Entry { string type, id, name; bool operator<(const Entry &a) const { return type < a.type; } }; multiset<Entry> entries; でequal_range使わせるかな
704 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 02:41:11 ] 定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。
705 名前:696=698 mailto:sage [2008/12/04(木) 06:11:17 ] レスありがと。 なるほど、色々手はありそうだね。 ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。 # 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w
706 名前:デフォルトの名無しさん [2008/12/04(木) 20:31:19 ] vectorを配列っぽく使ってるんですが、 eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか? vec.erase(vec[5]) vec[5].erase() みたいなことはできませんか?
707 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 20:34:31 ] begin()+5
708 名前:706 mailto:sage [2008/12/04(木) 20:36:56 ] おおー。感動です。ありがとうございました。
709 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:10:14 ] まあ使い辛いとは思うがな・・・。
710 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:28:47 ] 関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。 とどうでもいい回顧
711 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:29:42 ] . はともかく + は・・・。 数学的に、単独の方が違和感あると思われ。
712 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:34:59 ] 右辺値やな
713 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:12:57 ] for_eachの使い方を知ったときは感動したけどやっぱり使いづらい
714 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:21:25 ] lambda なしに for_each だけあってもね・・・。
715 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 10:23:09 ] range adapterも欲しいナ
716 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:00:27 ] rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない
717 名前:デフォルトの名無しさん [2008/12/06(土) 15:46:46 ] deque<string> buff; にpusu_back()は定数時間ですか?それと buff[0]みたいなアクセスはありですか?
718 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:32:10 ] 「deque push_back 定数時間」でググれば、皆同じことを言っているし、 buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、 何故こういう質問が書き込まれるんだろう。 あと、「みたいな」っていうのがよくわからん。 それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、 その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。 もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、 そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。 答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。
719 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:39:40 ] >>718 そんなのはいいから答え教えろかす
720 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:46:12 ] 長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな
721 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:49:17 ] std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので operator[]によるrandom accessが可能かつ、 push_backによる要素追加は償却で定数時間であることが保証されています
722 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 17:45:09 ] >>720 > 長々となに書いてんだろ 馬鹿が読むと煽りたくなるアドバイスじゃない?
723 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:13:35 ] むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw
724 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:18:33 ] これらの操作を提供するための条件として規定されてるからね。
725 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:15:49 ] set とかは insert だしな。
726 名前:デフォルトの名無しさん [2008/12/09(火) 14:44:05 ] vectorの2次元配列はどうすればいいんですか? 2次元目も動的にしたいんです
727 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 15:04:51 ] vector<vector<int> > v;
728 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:27:55 ] ありがとっ
729 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:01:36 ] これって問題ある? class CVector { vector<int> A; } vector<CVector> B; CVector.A.resize(10); B.resize(10);
730 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:03:22 ] class CVector { vector<int> A; }←セミコロンがない vector<CVector> B; CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい B.resize(10);
731 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:21:46 ] あそうか、こうしないとインスタンスが作れなかった class CVectorSub { public: vector<int> A; }; class CVectorMain { public: vector<CVector> B; }; class C { public: CVectorSub vSub; CVectorMain vMain; void Resize() { vSub.resize(10); vMain.resize(10); } };
732 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:24:20 ] やばい 2次元配列じゃなくなってる 意味ねぇ
733 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:39:28 ] あ!わかったthx! class CVectorSub { public: vector<int> A; }; class C { public: CVectorSub vSub; vector<CVectorSub> vMain; void Resize() { vSub.A,resize(100); vMain.resize(10); } };
734 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:44:36 ] うわ・・・これダメだ
735 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:45:35 ] >>733 vSubを操作してもvMainに影響しないし、vMainを操作してもvSubには影響しない。 わかってるならいいんだけど。 エスパーすると vector<vector<int> > vec; vec.resize(10); for(int i=0; i!=vec.size(); ++i) { vec[i].resize(10); } なんじゃないかと。 違ったら無視して。
736 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:56:13 ] いやそれです。ありがとう それだと全部同じ配列数になるのかと思ってしまった。 vec[0].resize(10); vec[5].resize(20); こう出来たんだ。 暴れてしまった・・・すまんTHX
737 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:12:04 ] 2次元配列の初期化とポインタの使い方あってますか? vector<vector<int>> vec(5, vector<int>(100, 0)); vector<vector<int>>* pVec = vec; pVec[3]->resize(200); pVec[3][180] = 12345;
738 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:33:26 ] いいえ。
739 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:37:41 ] >>737 > vector<vector<int>> まずこれがだめ。正しくは vector<vector<int> > 2行目はコンパイル通らない。 3行目と4行目も意味がめちゃくちゃ。
740 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:27:03 ] ポインタをインデクサで参照して実態をアロー演算子で参照してるがな 大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし つーか何でポインタが出てくんの?w
741 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:35:38 ] 何がしたいかよく分からない例だが そのまま直すとこんな感じか vector< vector<int> > vec(5, vector<int>(100, 0)); vector< vector<int> > *pVec = &vec; (*pVec)[3].resize( 200 ); (*pVec)[3][180] = 12345; しかしvectorに直接vector入れたらりサイズのコストがやばそうだな^^;
742 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:44:08 ] ありがと。 本2冊読んで> >の間のスペースがわからないのがやばい vector<vector<int> > vint; vector<vector<char> > vchar; ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど vector<vector>* pvec = char; ここの書き方がわからないお願い!
743 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:06:59 ] そこでテンプレート関数の出番ですよ main() { vector< vector<int> > vint; vector< vector<char> > vchar; if(〜〜〜) test(vint); else test(vchar); } templete<class T> test(T &vector) { vector[3].resize(200); vector[3][180] = 12345; } 適当に書いたから間違ってるかも分からん
744 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:27:33 ] >>742 共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。 なので>>743 の方法になる。
745 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:40:36 ] いや何を書いてあるのかがわからなかった コンテナの前にテンプレートを勉強してくる ありがと、まじありがとっ
746 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:45:38 ] 今更勉強するより0xまで待った方がいいかもなー
747 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:41:07 ] それは0x完全対応コンパイラを待ってから勉強するってこと? あ、老後の楽しみか
748 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 06:28:40 ] なに微妙に興奮してんのw
749 名前:デフォルトの名無しさん [2008/12/12(金) 07:10:55 ] >>748 オ○ニーしながらだからねw
750 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 09:04:47 ] 上級者すぐるw
751 名前:デフォルトの名無しさん [2008/12/13(土) 01:33:45 ] [SourceForge.net: Project File Releases: STLport] STLport STLport-5.2.1 released (Wed, 10 Dec 2008 10:50:47 GMT) (2008-12-10 19:50)
752 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 10:34:59 ] 0x ってもうあと一年しか残ってないんだ
753 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:13:07 ] もしかして 09 でなくて 0xa だったりして
754 名前:デフォルトの名無しさん [2008/12/13(土) 12:24:32 ] すみません、c++のカスタムアロケータでの質問なんですが カスタムアロケータとしてmy_allocatorを作り、 それを指定したbasic_stringを typedef basic_string<char, char_traits<char>, my_allocator<char> > my_string; と定義しました。 それでやりたいことなんですが my_string ms = "ms test"; std::string ss = "ss test"; ms = ss; と、アロケータの違うコンテナ同士で代入をしたいのです。 今はとりあえず my_string ms = "ms est"; std::string ss = "ss test"; ms = ss.c_str(); としてますが、ちょっと不恰好で気になってしまいます。 なにかスマートな方法はありますでしょうか?
755 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:50:12 ] assert(ms.size() >= ss.size()); std::copy(ss.begin(), ss.end(), ms.begin());
756 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:04:10 ] おぉなるほど、イテレータを使えばいいんですね。 ありがとうございます。参考にして作ってみます。
757 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:19:49 ] ss.assign(ms.begin(), ms.end());
758 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 18:59:03 ] STLの仕様とかよく理解できてないから根本的におかしいかもだけど、 map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型) コンパイルは通るんですが、insert()すると必ず失敗してしまいます。
759 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 19:12:31 ] 失敗ってどんな?
760 名前:758 mailto:sage [2008/12/15(月) 19:15:39 ] >>759 insert()したときの戻り値の.secondが必ずfalseになる
761 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 20:35:44 ] エラーが起きる最小限のソース貼ってみ
762 名前:758 mailto:sage [2008/12/15(月) 21:15:36 ] ↓にうpしときました www3.uploda.org/uporg1858304.zip.html Passはstlです 一応環境も書いときます WinVista SP1 VS9
763 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:26:08 ] 一時オブジェクト?
764 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:45:41 ] >>762 ttp://msdn.microsoft.com/en-us/library/ms632679.aspx CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。 insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。
765 名前:758 mailto:sage [2008/12/15(月) 22:46:02 ] ローカルのものをmapにはinsert出来ないということですか?
766 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:01:01 ] 764が言ってるのは、 自分でinsertを呼ぶよりも前に、WndProcが呼ばれて LPFUNC lpfn = hoge[ hWnd ]; で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ
767 名前:758 mailto:sage [2008/12/15(月) 23:11:12 ] なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。 つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。
768 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:12:11 ] >>765 つ // LPFUNC lpfn = hoge[ hWnd ]; // if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL; これでinsertは成功
769 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:18:39 ] わざわざエラー検査する必要ないのでは? hoge[ hWnd ]=lpfn; でいいじゃない
770 名前:758 mailto:sage [2008/12/15(月) 23:25:16 ] 無事解決しました。>>764 >>766 >>768 ありがとでした。 ちょっとSTL関係の本を探して勉強しなおしてきますw
771 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:17:45 ] STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う
772 名前:758 mailto:sage [2008/12/16(火) 17:26:11 ] CreateWindowが幾つかメッセージ送るのは知ってたんですが、 find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、 対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。