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 以降
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[]使うと存在しないキーを参照しようとしたときに、 対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。