[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 11/25 00:30 / Filesize : 208 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】STL(Standard Template Library)相談室 8



1 名前:858 [2007/12/24(月) 03:41:59 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 7
pc11.2ch.net/test/read.cgi/tech/1185986999/

過去ログ・リンク・書籍紹介は >>2 以降

620 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:48:46 ]
というか、おまいらTemplate使ってる?
Policyは非常に強力なコンセプトだと思うんだがね。

本当はもっと制約の少ないMix-in機能が欲しいけどね。
Policy同士で相互依存があると破綻しがちだから、けっこう設計が面倒。

621 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:49:24 ]
>619
あぁ、早速それ乗って近くの本屋にEffectiveSTL買いに行く予定だよ

622 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:12:32 ]
>>620
アレキサンドレスクの受け売りですか?

623 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:20:19 ]
メイヤーズもヴァンデヴォーデも質問したら
ちゃんと返事くれるんだな。できる人は違うわ。


624 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:20:59 ]
>>620
相互依存のあるPolicyなんて思い浮かばないんだけど
具体的にどんなの?

625 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:23:26 ]
あれってヴァンデヴォーデって読むのか……

626 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:23:56 ]
>622 基本的にはそんな感じなんだけど、Policyの組替えを想定してるんじゃなくて
単にデカいクラスのモジュール化をするときに使ったりしてる。

本当は包含とかでも何とかなるんだけどねぇ。
委譲関数書かなくて良いのが素敵なんで何となくポリシー使ってる。


627 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:26:16 ]
>>625
いや適当

628 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:27:48 ]
>624
もちろんきっちり設計してから組めば相互依存はほとんど無くすことができるんだけど、
トライ&エラーで設計するときはそんなこと言ってられないからね。
ルーズに始めるときは、たいてい相互依存バリバリだったりする…………

リファクタリングするときも相互依存した状態を経由するから、そういうときも不便。




629 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:32:02 ]
orthogonalってやつか

630 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:43:00 ]
>629
直交に分離するのは理想だけど、神様でもなければ一発でそんなに上手く行くわきゃ無いよな。



631 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 08:39:38 ]
std::map<T1, T2>をT2順に整列したものを使いたいんだけど、std::vector<std::pair<T1, T2> >に
コピーしてsortする方法だと、std::pair<T1, T2>が大きい時にコストがかかるのでイヤーン。
mapの要素へのポインタをvectorに格納してsortしたいんだけどうまくいかない。
std::vector<const std::pair<T1, T2>*>みたいの。
エロい人サンプルコード書いてくだちい。


632 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 09:21:28 ]
const pair<const int, int>* addressof(const pair<const int, int> &obj)
{
return &obj;
}

map<int, int> m;
m[0] = 3;

vector<const pair<const int, int>*> vec;
transform(m.begin(), m.end(), back_inserter(vec), addressof);

こんな感じ?

633 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:54:58 ]
ありがd。
でもソートも書いて欲しいよママン

634 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 22:28:39 ]
>633
そんな難しくもなさそうな気もするけど、まずはうまくいかなかったコードを書いてみれば?

635 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 22:39:37 ]
というか std::sortにbool op( const int *l, const int *r) { return *l<*r;}
を渡せば終わる話だからなー

636 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 22:44:01 ]
pair だからそれだと足りない。けどまぁその程度ではあるんでどういうところでつまるのかな、という方に興味があったり。

637 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:10:39 ]
こんなのは?意味違うかもしれんが。

typedef map<int, string> Mymap;

struct Mycomp {
 bool operator()(const pair<const int, string>* p1,
          const pair<const int, string>* p2) {
  return p1->second < p2->second;
 }
};

int main()
{
 Mymap m;
 //いろいろ挿入
 
 vector<pair<const int, string>* > vec;
 for(Mymap::iterator i = m.begin(); i != m.end(); ++i) {
    vec.push_back(&(*i));
 }

 sort(vec.begin(), vec.end(), Mycomp());

}



638 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:15:32 ]
sort_inserterみたいの作れば挿入とソートが一発で。コスト的にはあんまり美味しくないか。



639 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 00:02:14 ]
>>638
それなんてstd::set?

640 名前:デフォルトの名無しさん [2008/02/06(水) 00:15:23 ]
>>639
pairのsecondだけでソートってできるんだっけ?

641 名前:デフォルトの名無しさん [2008/02/06(水) 00:18:18 ]
あー失礼、compare指定すりゃいいだけだ。

642 名前:デフォルトの名無しさん [2008/02/09(土) 11:47:37 ]
vectorで使用したメモリ領域を開放する方法を教えてください。

vector<int> v;
v.reserve (100000);

ぐらいの領域を使った後

v.clear ();
cout << "capacity = " << v.catacity() << "\n";

capacityが100000を返してくるのですが、どうやって領域を開放したらいいのでしょうか?
v自体はまだ使うので消したくありません。




643 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 11:54:07 ]
vector<int>().swap(v);

644 名前:642 [2008/02/09(土) 12:01:01 ]
>>643
できた。ありがとう! お前まじ天才
さしつかえなければ、何をどうやって勉強すればお前みたいになれるのか教えてください。


645 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 12:03:27 ]
とりあえず

つ"Effective STL"

646 名前:642 [2008/02/09(土) 12:08:50 ]
買った。
これを読んで俺も天才になる

647 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 12:31:42 ]
天才って言葉の使い方間違ってる

648 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:05:16 ]
むしろ転載に近いよな。



649 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:29:09 ]
メイヤーズSTLはジョスティスの内容をパクってるものが多い。

650 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:10:30 ]
で っていう

651 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:58:50 ]
その本にじょてぃすすげー参考にしたって書いてあったから
じょてぃす買った俺が通りますよ。
じょてぃすは絶版になるべきではなかった。

652 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:19:14 ]
>>651
原書を読み漁ったおれもいますよ。平易な英語だから無問題。

653 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:24:52 ]
Vandevoorde も忘れないでね。

654 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:50:38 ]
>>653
TemplateならあるがSTLの本なんて書いてたっけ?

655 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:56:21 ]
お前ら日本語でしゃべれ

656 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 02:11:51 ]
よし今回だけだぞ

657 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:54:08 ]
>643 の方法だとstd::stringには効果無いのですが、
stringの場合は明示的にメモリ解放する手段て無いのでしょうか?

658 名前:657 mailto:sage [2008/02/11(月) 08:06:11 ]
すみません、VC2005のstd::stringだと、作成した
直後の状態である程度のバッファが確保されてるだけでした。



659 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:50:34 ]
STLにTStringListみたいなのありましたっけ?

やっぱ、
>std::vector <std::string>
ですか?

660 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:53:14 ]
>>659
うん。 TStringList という名前だけ見ると、どちらかといえば std::list<std::string> かと。

661 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:03:11 ]
有難う。

実は、vectorしか使ったことないのです。listとvectorの違いを知りたいです。


662 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:06:33 ]
事故解決しました。
記述は大差ないみたいですね。
実行効率とメモリの違いみたいな。

ttp://ml.tietew.jp/cppll/cppll_novice/article/269

663 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:05:03 ]
大差ある。

664 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 17:07:51 ]
vector
ランダムアクセス可能。
メモリが連続している。

list
ランダムアクセスできない。
当該要素のerase以外で参照・イテレータが無効化されない。(個人的にはこれが一番重要)
任意位置への挿入・削除が定数時間。
独特な操作(spliceなど)がある。

選択する上で気をつけるのはこんなとこか?

665 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 17:20:05 ]
なるほど、どうも有難うございます。


選択って意味では、
vector と list を間違えるより、
vector と map(←これもまだ使ったこと無いw) を間違えたら大変な気がしました。

666 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 18:24:34 ]
いや、vector使うつもりでlistつかうよりmap使った方が多分マシだぞ

667 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:46:00 ]
そもそもコンテナに何を求めているかによる。
連続性が重要ならlistもmapも同じくらい散々な目に遭うし、一応コンパイルが通ればいいだけなら
vectorでもmapでも問題ない。

668 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:59:15 ]
ポインタつなげて線形リンクリスト作らされたことってないの?



669 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:17:35 ]
>>668
標準ではないがstd::slistってのがある。

670 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:56:57 ]
>>669
std::listだって線形リンクリストでしょ。双方向であるというだけで。

671 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:50:44 ]
std::list って単方向じゃなかったけか?

672 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:53:08 ]
いいえ。

673 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:53:10 ]
あ、ごめ。双方向だった・・・
よく考えたら reverse_iterator 使えるもんね。

674 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:14:36 ]
連続性が要らないなら、vectorよりdequeつかっとけって誰かえらいひとが
言ってた気がする

675 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:36:37 ]
要素数が万単位にならなければlistよりvectorつかっとけって誰かえらいひとが
言ってた気がする

676 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:41:25 ]
www.codeproject.com/KB/stl/vector_vs_deque.aspx

677 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 03:13:20 ]
>>676
dequeメチャメチャ速いやん

678 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 03:35:20 ]
むしろvectorがいらない子だろう



679 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 07:49:19 ]
オブジェクトのサイズ/要素数が大きくない場合
listはvectorに比べてアロケーションの多さと断片化が弱点になりそうだよね

680 名前:666 mailto:sage [2008/02/15(金) 08:45:44 ]
なるほど、今までvectorのみ使ってましたがmapにトライしてみます。

というより、実はネットで拾ったライブラリがmap使ってて、初期化宣言見ただけで”えっ”と思ってもう理解するの必須。

vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね?
何度も文献とかで確認しましたが、結局怖くて1つ1つイテレーター参照してますが。

ところで、map使うとプライマリキーみたいなのが必須ですよね?
キーがいる場合にはピッタリですが、開発途中でやっぱキーいらね、とかなったら、
とりあえず連番で埋めとけば良いわけですかね。
その時点でvectorかlistに差し替えかな。

>>668
線形リスト勉強しました。その頃C++どころかC初心者だったため、氏にました。
で、STLって何て便利なんだろう(これで使い方さえもう少し簡単であれば)って思ってまつ。

681 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 08:46:35 ]
 ↑
>666

は間違いで、665です。

682 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 09:04:18 ]
mapについてそんなふうに思ってる人は始めて見たw
データベースみたいな複雑なものじゃなくてただの写像ですよ。
電話帳みたいな何かと何かの対応表だと思えばいい。
パフォーマンスに関してはそれを理解してからでいいと思う。

>vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね?
多分大丈夫だけどやる必要ないならやらないに越したものはない。

>その時点でvectorかlistに差し替えかな。
パフォーマンス以前に用途が違うのでそのとおり。

>で、STLって何て便利なんだろう(これで使い方さえもう少し簡単であれば)って思ってまつ。
便利さを追求した結果こうなったんだろう。
ただしその上で、できるだけ簡単にはなってると思う。

683 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 09:56:51 ]
mapなんて連想配列ですよ。awk使いの私が言うんだから間違いありません。

>>vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね?
多分じゃなくて大丈夫だけど、memcpy()などを自分で使うのはお勧めしない。潜在的なバグの原因になりかねない。
APIに渡すなどのように、必要に迫られたときに限定した方がいい。

684 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:18:40 ]
boostとかにTStringListに近いものがあったりしないでしょうかね?

685 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:38:33 ]
そんな無駄なものはない

686 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:39:27 ]
ま、StringListクラス宣言して、中の人にmultimapすれば、自分でメソッド作るだけですか。
車輪の再開発とか言われたら嫌だから、既にあるものをなるべく使いたいです。

687 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:40:46 ]
コンテナに使われている例えば連想コンテナのデータ構造(平衡二分木)とか
に詳しい人いる?

688 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:42:54 ]
>686
どんなことがやりたいの?



689 名前:686 mailto:sage [2008/02/15(金) 10:55:33 ]
どちらかというと、やりたいことがあるのでなくて、移植作業のためにTStringListメソッド実装。

CommaTextの入出力、iniファイルの1行処理のためのValues/Namesプロパティ、IndexOf、ファイル入出力メソッド、要素文字連結 etc..

690 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 11:11:00 ]
>>687
ここにそれなりに詳しく書かれてるよ
ja.wikipedia.org/wiki/%E8%B5%A4%E9%BB%92%E6%9C%A8

691 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 11:29:40 ]
>>689
組み合わせて使えばできそうな気がする。

boost.lambda
boost.string_algo
boost.tokenizer

ファイル入出力はfstreamとalgorithm使えばよし。

692 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 12:48:59 ]
typedef vector<int> vector_int;

typedef deque<int> vector_int;

に書き換えただけで、うちのソフトの体感速度が上がったw
処理速度アップ!ってバージョンアップ唄えるお( ^ω^)

693 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:02:15 ]
>typedef vector<int> vector_int;
>typedef deque<int> vector_int;

kwsk
何が違うのか教えれ!


694 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:09:15 ]
vectorに数万とかpush_backして再アロケートが発生しまくったんじゃないかと予想

695 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:11:54 ]
その2つはメソッドは同じなの?

696 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:13:34 ]
バッファの連続性が必要なくて、
確保すべきメモリ量が事前によく分からないなら、
vector より deque の方が圧倒的に効率的。

697 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:07:45 ]
いままでboost::shared_ptrのコンテナにstd::listを使ってたけど
std::dequeにしたら速くなるのかな
でもスマポのコピーは時間かかりそうだな...

698 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:11:04 ]
push_back のコストは list より deque の方が平均的には少ないはずだが



699 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:16:41 ]
mapってシーケンシャルアクセス、かつ、入れた順番に取り出す、もできますか?

700 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:18:42 ]
もっと詳しく

701 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:20:57 ]
mapをbeginからendまで参照した場合、
順番は、mapに登録した順番になっててくれますか?

702 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:23:46 ]
>>699
入れた順番は失われる

703 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:24:29 ]
>>701
Sort Criterionによる

704 名前:699 mailto:sage [2008/02/15(金) 14:27:50 ]
>Sort Criterionによる

kwsk
ググっても出ません。

705 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:30:43 ]
map<string, int> m;
m["foo"] = 0;
m["bar"] = 1;

と、

map<string, int> m;
m["bar"] = 1;
m["foo"] = 0;

で異なる挙動になるようにしたいって事だろ?
標準のmapではどうやっても不可能だと思う

706 名前:699 mailto:sage [2008/02/15(金) 14:35:07 ]
え”〜ショック。

つまり、並び順が保障されるのは、vectorとdequeだけですかぁ。

707 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:37:31 ]
だってmapはシーケンスコンテナじゃないし

708 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:42:34 ]
>>704
テンプレートパラメータかオブジェクトととして渡す
ソート基準による。



709 名前:699 mailto:sage [2008/02/15(金) 14:47:40 ]
じゃ、mapはやめて、vectorします。

vectorのヘルプ見てると、pos番目の要素をとるには[pos]ではなくて、at(pos)を使えと書いてありますね。

atを使わずに[]を使ってると、dequeに置き換えが出来なくなるわけでしょうか?

710 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:48:47 ]
operator[]は範囲チェックをしないけどatはする
違いはそれだけ

dequeにもoperator[]はあるから、その心配は要らない

711 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:19:32 ]
ごめん。未だに
「Associative Containerじゃ駄目なんですか。じゃあSequenceにします」
が簡単に出来る場面というのが想像できない

712 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:29:56 ]
線形探索しても痛くないときとか

713 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:07:05 ]
>>695 >>709
>>676のリンク先にも書いてあるけど、vectorとdequeのメンバ関数の違いは
・vectorにだけある……capacity() reserve()
・dequeにだけある……push_front() pop_front()
だけ。

いずれもメモリの連続性に関わるもので、前者が「あらかじめ確保しておく」系(dequeには要らない)、
後者が「先頭要素を出し入れする」系(vectorには高コスト過ぎ)。

714 名前:695 mailto:sage [2008/02/15(金) 17:11:30 ]
サンクス。

STLってキモカワイイね。

715 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:31:49 ]
個人的にはlistがいらない子のようなきがしてます

716 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:40:48 ]
dequeにはspliceが無いだろ?

717 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:46:29 ]
listはアロケータさえちゃんと作れば、本当はやれば出来る子

718 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:54:59 ]
vectorはお金がかかる子。

vector(笑)



719 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:11:05 ]
vectorとdequeの最大の違いは、stackコンテナでdequeがデフォルト
コンテナとして使われてることを見ればわかるね。メモリ構造の違い
によってvectorは要素を削除した場合に絶対にメモリを解放しないが
dequeはチャンクの集まりだから不要なチャンクは解放されることが多い。
(これはstandardでは求められていないらしいが)
また、reallocateの際、vectorは全ての要素を移動する必要があるが
dequeは必ずしもそうはならない。同じ要素へのアクセスではvectorの
ほうが理論的には高速。dequeはメモリ構造上indirect accessとなるから。

このくらいしか気にしてないけど、結局は要素数と実測で決めることにしてる。



720 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:04:47 ]
>>706
次期C++ではinsert(iterator, value)の意味が変わって、
同順の要素の間で好きな場所に値を挿入できるようになる。
それまではstd::map<Key, std::deque<T> >でも使うしかないね。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<208KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef