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

このエントリーをはてなブックマークに追加
672デフォルトの名無しさん
コンテナの使い分けってどうすればいいんですか?

ランダムアクセスが不要な場合は list を使えばいいとして
vector と deque の使いわけがよく分かりません

色々なソースを見ると、vector の使用頻度が高いように思えるのですが
要素の追加で再配置しなくていい分 deque の方がいいんじゃないですか?
673デフォルトの名無しさん:2009/12/08(火) 14:51:21
dequeだとブロックで扱えないので、そこが使い分けるポイントかな。
674デフォルトの名無しさん:2009/12/08(火) 14:53:18
>>672
deque には vector には無い空間オーバーヘッドと速度オーバーヘッドがある。
vector で済むところに使えば無駄になることもある。

どちらが大きな問題になりやすいかと言えば vector の再配置だろうから、
ランダムアクセスコンテナとして deque を優先的に使うという話には一理ある。
675デフォルトの名無しさん:2009/12/08(火) 15:01:49
>>673-674
大きさを指定し、あまり拡張のない場合は vector の方がパフォーマンスがいいということですか
ありがとうございます、1つの基準にします
676デフォルトの名無しさん:2009/12/08(火) 15:22:10
入門書がだいたいvectorで始まるもんで、dequeのほうがいい場面でもvector使っちゃう人が初心者には多いような
・・・上級者にも多いとは言わないよね
677デフォルトの名無しさん:2009/12/08(火) 15:37:07
dequeが意外と遅い場合もあってポインタのvectorですませちゃうな。
要素の追加も大抵上限や要素数わかってたりするからreserveで十分だし。
678デフォルトの名無しさん:2009/12/08(火) 15:43:47
本当にどっちでもいいならvectorを使うだろう。わざわざ複雑な方を使うこともない。
でもコンテナの使用頻度的にはvector>deque>listかな。listが要る場合ってほとんどない。
679デフォルトの名無しさん:2009/12/08(火) 15:46:02
シーケンシャルアクセル:
list > vector > deque

ランダムアクセス:
vector > deque

追加:
list > vector > deque

追加(サイズ変):
list > deque > vector

この認識であってる?
680デフォルトの名無しさん:2009/12/08(火) 15:50:57
シーケンシャルは
vector > list
なのでは?
681デフォルトの名無しさん:2009/12/08(火) 15:56:34
>>679
シーケンシャルアクセル:
vector > deque >> list

ランダムアクセス:
vector > deque

追加:先頭:キャパシティ変更なし
list > deque >>> vector

追加:先頭:キャパシティ変更
list > deque >>> vector

追加(サイズ変):
list > deque > vector
>
> この認識であってる?
682デフォルトの名無しさん:2009/12/08(火) 15:57:40
すまん、途中で送信しちゃった。
683デフォルトの名無しさん:2009/12/08(火) 16:03:21
とにかく参照はvector最強、でいいよ。
684デフォルトの名無しさん:2009/12/08(火) 16:06:36
>>679
こうじゃない?

シーケンシャルアクセス:
vector > deque >> list

ランダムアクセス:
vector > deque >>> list

挿入:先頭:キャパシティ変更なし
deque > list >>>> vector

挿入:先頭:キャパシティ変更あり
list >> deque >>>> vector

挿入:中間:キャパシティ変更なし
list >>> vector > deque

挿入:中間:キャパシティ変更あり
list >>>> vector > deque

挿入:末尾:キャパシティ変更なし
vector > deque > list

挿入:末尾:キャパシティ変更あり
list >> deque >>>> vector
685デフォルトの名無しさん:2009/12/08(火) 16:14:36
不等号並べて書いちゃう男の人って・・・
686デフォルトの名無しさん:2009/12/08(火) 16:21:33
こうやって見ると、deque の使い所がいまいち……。

メモリ効率を度外視し、vector をほぼ固定配列として使える場合、
vector でなく deque にしかできないこと、使う理由ってありますか?
687デフォルトの名無しさん:2009/12/08(火) 16:29:01
dequeは名前の通りキューとしてだけ使えばおk
688デフォルトの名無しさん:2009/12/08(火) 16:40:30
>>684
いろいろ間違ってるだろ。
dequeはオブジェクトのメモリ領域がエレメント複数個をまとめてアロケートされるからvectorのキャパシティ変更に関わらず
挿入:先頭
list > deque >>>> vector
挿入:末尾
vector > deque >= list
挿入:末尾:キャパシティ変更あり
list >= deque >>>> vector
だしdequeは全てのエレメントが連続しているわけじゃないから実際には
挿入:中間
list > deque > vecto
しかも「キャパシティ変更」の有無でvector以外のクラスの順位が変わるのも変。
知ったかぶりはやめろ。
689デフォルトの名無しさん:2009/12/08(火) 16:46:39
dequeは末尾・先頭への追加に限れば、メモリ拡張の必要がある時にも
既存の要素のコピーが発生せず、参照やポインタも無効化されない。
これは大きな利点だと思う。
690デフォルトの名無しさん:2009/12/08(火) 16:49:35
deque<bool>はコンテナ用件を満たすけど
vector<bool>は満たさないという問題も。

速度に関しては実測せよとアレに書いてあったじゃろ?
そして、自信を持ってvectorを選択せよ、とも。

アレが何かわからない人には教えてあげません^^
691デフォルトの名無しさん:2009/12/08(火) 16:52:39
[          vector          ]

[ ][      deque      ][ ][ ][ ]

[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] list

こういうことですか
deque はリストと同じような構造だと思ってました
692デフォルトの名無しさん:2009/12/08(火) 16:58:06
dequeはVCだと要素数2の配列がlist構造だね。
他の処理系は知らん。
693デフォルトの名無しさん:2009/12/08(火) 17:08:34
両刀マッチョ行列
694デフォルトの名無しさん:2009/12/08(火) 17:54:17
>>688
listの挿入はメモリ確保が生じるからキャパシティに余裕があるvector,dequeに対しては
挿入:先頭:キャパシティ変更なし
deque > list >>>> vector

挿入:末尾:キャパシティ変更なし
vector = deque > list
でいいだろ。
695デフォルトの名無しさん:2009/12/08(火) 17:54:41
いやいやいや deque は、”一般的な利用”においては、vectorに比べ圧倒的に速いぞ。
極論言えば、むしろvectorがいらんぐらいだ。 vectorの利点はmemcpy()が使えるぐらいのもんだ
696デフォルトの名無しさん:2009/12/08(火) 17:57:18
その”一般的な利用”とかいうのはどんな統計的手法に基づいて評価されたものなのだ。
ちゃんとソースを出すのだ。

ここは文系のカスプログラマが思い込みでクソ垂れる場所じゃないんで。
697デフォルトの名無しさん:2009/12/08(火) 17:59:44
たかだかコレクションの実装について速いだの遅いだの言ってるお前らがカワイイよ。
698デフォルトの名無しさん:2009/12/08(火) 18:00:23
おおまかな使い分けについては規格に書いてあるよ

特に(dequeやlistを使う)理由がないときはvector
先頭末尾への挿入削除が多い場合はdeque
中間への挿入削除が多い場合はlist
だった気がする
699デフォルトの名無しさん:2009/12/08(火) 18:00:27
確か過去スレでdeque vs vectorの議論あったな
700デフォルトの名無しさん:2009/12/08(火) 18:01:39
いやいや圧倒的に速いならdeque使うしかないだろ
701デフォルトの名無しさん:2009/12/08(火) 18:04:03
お前らのアプリはコレクションに支配されてんの?
実行時間の80%はこれらをソートしたりナメたり入れたり出したりしてんの?
702デフォルトの名無しさん:2009/12/08(火) 18:07:56
703デフォルトの名無しさん:2009/12/08(火) 18:09:30
>>701
vectorからdeque へのtypedef書き加えるだけでも、多くのケースで体感スピード上がるという話
704デフォルトの名無しさん:2009/12/08(火) 18:11:33
>>702
英語は読めないのでエスペラント語でお願いします。
705デフォルトの名無しさん:2009/12/08(火) 18:20:58
vectorはメモリの連続性が真に必要なときと1バイトでもメモリ使用量を減らしたいときにだけ使え。
706デフォルトの名無しさん:2009/12/08(火) 18:21:19
エスペラントなんて欧米の一部言語学保守派しか使ってないだろ
707デフォルトの名無しさん:2009/12/08(火) 18:34:10
10000件近い固定サイズ構造体をdequeで使ってたんだが、boost::poolのアロケータ組み込んだら
計測値で1.7倍程度速くなった。
アルゴリズム以前にアロケータでのメモリ確保処理の速度も考えたほうがよさげ
(vectorではこうはいかない)
708デフォルトの名無しさん:2009/12/08(火) 18:35:21
ちょっと書き方が不足してた
10000件近いデータを、数百〜数千件単位で頻繁に挿入・削除してるという使い方。
709デフォルトの名無しさん:2009/12/08(火) 19:16:17
>>707
それはとくにdequeが適する
場合なのでは?

万能コンテナなんか存在しない、
使い分けが大切、でFA。
710デフォルトの名無しさん:2009/12/08(火) 19:18:01
>>706
日本語なんて極東の小さな島国でしか使われていませんよ?

それのせいでコンピュータ関連の書籍が
日本語になるのは世界から1,2年遅れていて、
プログラマになったばかりの小学6年生が学習書にも困る有様です。
まったく持ってIT後進国です。
711デフォルトの名無しさん:2009/12/08(火) 19:18:57
誰も万能、って話をしていない現実w
712デフォルトの名無しさん:2009/12/08(火) 19:22:23
>>705
>1バイトでもメモリ使用量を減らしたい
フラグメを考えると、使用量は逆に
意外と増えがち。

vectorのオススメは
○reserve()できるとき。
○挿入が少なく、参照が多いとき。
だろう。
713デフォルトの名無しさん:2009/12/08(火) 19:23:42
そういったケースだと、
vector<CLS*>かdeque<CLS*>かlist<CLS*>の方がよさげ
構造体をまるまる挿入するのが負荷が掛かるから。
714デフォルトの名無しさん:2009/12/08(火) 19:25:13
listはlist同士の連結にコストがかからないから
状況が許すならそれも高速、安価で便利^^
715デフォルトの名無しさん:2009/12/08(火) 19:25:16
画像処理で垂直方向の連続性は重視しないからとdeque<vector<T> >にしたら驚くほど遅くなったな。
垂直方向は参照回数少ないからそんなに遅くならないと思ったのに。
716デフォルトの名無しさん:2009/12/08(火) 19:26:12
いくらメモリプールしたところで実際に100バイトの転送が発生すれば遅い。ポインタの付け替えだけなら
どれだけ巨大でも4バイトの挿入だけ。
717デフォルトの名無しさん:2009/12/08(火) 19:26:36
馬鹿か垂直方向でもメモリの前後順序性は崩れないだろうが
718デフォルトの名無しさん:2009/12/08(火) 19:29:40
メモリ確保がボトルネックなっているなら
Googleメモリ確保使うと良いよ。
ソースコードの変更無しで最適化出来る。
しかし、メモリ確保でボトルネックになっているのは
ほとんど処理してないって事。
もともとのソースがへぼってこと。
719デフォルトの名無しさん:2009/12/08(火) 20:36:40
>>696
           ,, -──- 、._ 
        .-"´         \.
        :/   _ノ    ヽ、_ ヽ.:
        :/   o゚((●)) ((●))゚oヽ:
      :|       (__人__)    |:
      :l        )  (      l:
      :` 、       `ー'     /:
       :, -‐ (_).        /
       :l_j_j_j と)丶─‐┬.''´
          :ヽ   :i |:
             :/  :⊂ノ|:
720デフォルトの名無しさん:2009/12/08(火) 21:50:33
なんだ、本当のことを言われてくやしかったのか?
「定量化できないものは評価できない」
721デフォルトの名無しさん:2009/12/09(水) 01:23:06
まじめに議論するところでもないんだなこれが・・・
722デフォルトの名無しさん:2009/12/09(水) 01:32:23
そうでもないよ。それはその時にいる人間のレベル次第。
無能なドカタが、実生活では絶対不可能な上から目線を楽しみに来てる時とかは
まじめな議論にはならんが、いつもそうと決まったわけでもない。
723デフォルトの名無しさん:2009/12/09(水) 05:12:04
listは10万要素くらい一度に確保するとめちゃめちゃ遅いのもデメリットか
724デフォルトの名無しさん:2009/12/09(水) 05:19:59
mapやlistは使い所が難しいところ。
速度は気にしないならいつでも使える。
dequeもそう。
基本はvectorとstringだな。
これでも使い方次第でパフォーマンスが落ちるが。
725デフォルトの名無しさん:2009/12/09(水) 05:22:03
vectorは再配置が起きると、以前の2倍確保するらしい。
これがかなりくせ者。
自前で確保したなら50Mで済むところが
自動だと100M確保したりする。
726デフォルトの名無しさん:2009/12/09(水) 05:24:16
再配置の起こらないvector互換クラスはない物か。
fileをHDDに記録するように分断しつつvectorの機能も使えるやつ
727デフォルトの名無しさん:2009/12/09(水) 05:32:26
そりゃdequeじゃね?
728デフォルトの名無しさん:2009/12/09(水) 05:43:02
dequeは再配置はしないの?
729デフォルトの名無しさん:2009/12/09(水) 06:14:07
>>728
構造的にFATと似てるので、HDDと同じような
索引テーブル上の再配置しかしないのじゃないかと思う。
730729:2009/12/09(水) 06:31:55
あーごめん。挿入すると再配置発生するそうだ
731デフォルトの名無しさん:2009/12/09(水) 08:24:56
>>724
mapの使いどころは簡単。
キー検索を多用するときだろ。
732デフォルトの名無しさん:2009/12/09(水) 08:32:18
>>725
それは実装によるんだろうが、じゃあ
どんなアルゴリズムがいいのか、
というと、難しいだろう。

アロケータみたいに、テンプレート
型引数で、容量拡張方法を設定
できてもいいのにね。
733デフォルトの名無しさん:2009/12/09(水) 18:48:25
単にラップしてreserveを自前で行うようにすればいいだけ。
734デフォルトの名無しさん:2009/12/09(水) 23:11:45
vector
要素追加: O(n)
要素削除: O(n)
ランダムアクセス: O(1)

list
要素追加: O(1)
要素削除: O(1)

deque
末端要素追加: O(1)
末端要素削除: O(1)
中間要素追加: O(n)
中間要素削除: O(n)
ランダムアクセス: O(1)
735デフォルトの名無しさん:2009/12/09(水) 23:25:50
ビッグオー表記における定数時間とは
毎回1マイクロ秒でも定数だし
毎回100000000000時間でも定数には違いない。
736デフォルトの名無しさん:2009/12/09(水) 23:30:12
>>734
vectorの存在価値ないな
737デフォルトの名無しさん:2009/12/10(木) 00:41:02
>>736
> vectorの存在価値ないな
>>735がいってるようにランダムアクセスO(1)でもvectorとdequeでは実際に要する時間は違う。
738デフォルトの名無しさん:2009/12/10(木) 01:13:02
dequeはめっちゃ遅いぞ大抵の処理系では
739デフォルトの名無しさん:2009/12/10(木) 01:40:21
末端からニョキニョキ伸び縮みするような構造のために作られたものだからな
要するにstackとqueue用

でも遅すぎるので誰も使わない
740デフォルトの名無しさん:2009/12/10(木) 01:41:57
固定長配列でok
741デフォルトの名無しさん:2009/12/10(木) 02:04:09
dequeのバッファが最近の実装になるほどサイズが小さい傾向にあるのは
何でだろう?
742デフォルトの名無しさん:2009/12/10(木) 03:00:53
大抵の実装でvectorの要素追加がときどきO(n)になるけど、
これって仕様に明記されてたっけ?
743デフォルトの名無しさん:2009/12/10(木) 03:06:09
されてる
というかO(n)はデタラメで本当は別の定義がなされているからな
たまにとんでもなくコストが掛かるぜ
744デフォルトの名無しさん:2009/12/10(木) 21:16:19
正しくは償却時間
745デフォルトの名無しさん:2009/12/10(木) 21:28:37
746デフォルトの名無しさん:2009/12/10(木) 22:29:34
償却時間はεπιστ?μηが勝手に作り出した謎の単語だ
747デフォルトの名無しさん:2009/12/10(木) 22:40:58
まあ正しくは償却時間計算量あるいは償却計算量あたりかな
意味不明というほどではないが
748デフォルトの名無しさん:2009/12/10(木) 22:53:10
JISにはなんて書いてあるんだろ。
戻り値も正しくは返却値って言うんだってね。
知らんかった。
749デフォルトの名無しさん:2009/12/11(金) 01:23:57
>>747
「償却定数〜」じゃないと意味わかんないってば。
750デフォルトの名無しさん:2009/12/11(金) 01:24:01
JISでは「みなし定数時間」とかだったような
償却でも別にいいと思うけどね
「戻り値」や「フレンド関数」と同じくらい何を指してるか明白だと思う

こないだC++相談室で見た「テンプレートクラス」は謎杉だと思った
誰だよ考えたやつ
751デフォルトの名無しさん:2009/12/11(金) 03:08:11
>>750
なにが謎なの?
752デフォルトの名無しさん:2009/12/11(金) 10:09:31
クラステンプレートで書かれたクラスなんじゃね?<テンプレートクラス
753デフォルトの名無しさん:2009/12/11(金) 12:11:26
クラステンプレート:template<typename T> class Hoge;
テンプレートクラス:Hoge<int>
754デフォルトの名無しさん:2009/12/11(金) 13:18:05
素直に考えればクラステンプレートはテンプレートの一種でテンプレートクラスはクラスの一種であろうと考えるのは自然な考え。
それに沿えば>>753のどこに謎があるんだ?。
755デフォルトの名無しさん:2009/12/11(金) 21:18:23
>>571-754
言葉のうえで
戻り値が returns を指し、フレンドが friend を指すってのは理解できるが
テンプレートクラスが instantiated class を指すってのはちょっと理解できないな
JISにもそんな言葉はない(実は1箇所あるんだけどねw)

もちろん、>>752-754のような想像をすることはまったく難しいことではないし、
JISの具現されたクラスの代替が欲しい気持ちも分かる

謎なのは instantiated class からどうやってテンプレートクラスっていう言葉を生み出したのかってこと
たとえば、禿が「instantiated classよりもtemplate classのほうがよくね?」って言ったなら謎はそれで解決
そもそも>>751-754はどこでその言葉を覚えたのかが気になる。できれば教えて欲しい
756デフォルトの名無しさん:2009/12/11(金) 21:23:00
template<...>
class ...

テンプレートクラスって読みたくなるだろ?
757デフォルトの名無しさん:2009/12/11(金) 21:33:22
>>756
それはクラステンプレートだろww
758デフォルトの名無しさん:2009/12/11(金) 21:35:01
クラステンプレート
関数テンプレート
メンバ関数テンプレート
759デフォルトの名無しさん:2009/12/12(土) 01:39:56
>>755
> そもそも>>751-754はどこでその言葉を覚えたのかが気になる。できれば教えて欲しい
なんで>>751-754がその言葉を以前にどこかで覚えていたということが確定事項なんだ?
>>752は推測を書いてるだけだし>>754は単語の意味論で素直に推測をした場合には>>753が書いた具体例に問題は見つからないと書いてるだけのようだが。
そんなことはたった今知ったばかりの言葉についても書けるだろ。
760デフォルトの名無しさん:2009/12/12(土) 02:15:40
>>579
確かにそうだな
761デフォルトの名無しさん:2009/12/12(土) 02:31:45
そもそも、言い回しの問題で、謎とか否定するようなものではないと思う。

Stroustrupだって、template classという言い回しは使うし。
ttp://www2.research.att.com/~bs/glossary.html

Stroustrupが間違ってるというなら、俺は何も言えない。
762デフォルトの名無しさん:2009/12/12(土) 04:10:59
C++ Templates: The Complete Guide 7.1 にも記述があるね
763デフォルトの名無しさん:2009/12/12(土) 04:50:48
> クラステンプレート、テンプレートクラス
俺はC++3rdでそう学習したけど。
っていうか今の今まで、他に呼び方が存在するなんて思ったこともなかった。
764デフォルトの名無しさん:2009/12/12(土) 10:17:03
>>761を引っ張ってきた人エロイ!
template function とかもあるね
そりゃ日本人も外人も適当に名詞化するわなあ
765デフォルトの名無しさん:2009/12/12(土) 11:07:33
規格にあってもinstantiated classじゃただの実体化されたクラスの意味でテンプレートとの関係をうかがわせるものは何もないからな。
規格にない俗語でもより本質に近い言葉があればそっちのほうを使いたくなるわな。
766デフォルトの名無しさん:2009/12/12(土) 17:18:15
うかがわせてるだろ十分に。
767デフォルトの名無しさん:2009/12/12(土) 18:28:16
そのプログラム中でインスタンスが生成されたクラスのことですか?
768デフォルトの名無しさん:2010/01/09(土) 12:12:23 BE:1350716459-2BP(0)
循環参照リストをSTLコンテナとして作ろうとしたら
beginとendが一緒になってしまって
STLコンテナには成れなかったでござる
769デフォルトの名無しさん:2010/01/09(土) 13:09:42
よくわからんけど
*begin == *end かつ begin != end なイテレータにすれば?
余計なフラグを持つことになってオーバーヘッドになりそうだけど
770デフォルトの名無しさん:2010/01/09(土) 13:39:38 BE:720381964-2BP(0)
>>769
循環参照リストにするからには

circular<int> c;
// 10個くらいpush_back
std::vector<int> v(c.begin() + 5, c.begin() + 5);

みたいな使い方もしたくて、
begin != end にしても無理だと思う。
771デフォルトの名無しさん:2010/01/09(土) 14:04:25
そうすると、beginかendであることを示せる特殊なイテレータを生成できればいいわけだな。
例えば、inc/decされていない同士の比較は常にfalseを返すとか。
要素数0のときはちょっと考えないといけないが。
772デフォルトの名無しさん:2010/01/09(土) 14:13:01
循環参照リストでなく循環リストでないの?
おいといて、begin,endをオフセットさせるメンバとか、内容でなく移動距離で比較するイテレータとか用意すれば?
circular<int> c;
// 10個くらいpush_back
c.setiteroffset(5);
std::vector<int> v(c.begin(), c.end());

std::vector<int> v((c.begin()+5).resetmove(), c.distanceiter(c.size()));
773デフォルトの名無しさん:2010/01/09(土) 14:38:06 BE:1050556875-2BP(0)
すまん誤解を招く言い方だった。
考えてもらって大変申し訳ないんだが、
STLコンテナに成れなかっただけで
独自仕様のコンテナとしては完成してるんだ。

具体的な実装は
http://www.cgal.org/Manual/3.3/doc_html/Developers_manual/Developers_manual/Chapter_iterators_and_circulators.html
これに似た感じになってる。
774デフォルトの名無しさん:2010/01/17(日) 18:51:42
class C
{
C(char*psz){};
C(int n){};
};
とすると、
C c[]={"hogehoge",0xaf0};
と設定できますが、
std::vetor<C> vc={"hogehoge",0xaf0};
と設定出来ないのは何故でしょうか?
設定する方法などがあればご教授願いたいのですが。
775774:2010/01/17(日) 18:53:46
間違えた
×>vetor
○>vector
776デフォルトの名無しさん:2010/01/17(日) 18:55:46
>>774
現行の規格では = {...} によるクラス型の初期化を定義する方法が無いから。
次の規格改訂で可能になる。
777デフォルトの名無しさん:2010/01/25(月) 22:26:42
イテレータの要素を全部足すのってどうしたらいいですか?

778デフォルトの名無しさん:2010/01/25(月) 22:39:47
template<class Dest, class Iterator>
typename void add_range(Dest& dst, Iterator first, Iterator last) {
 for(; first != last; first++) dst += *first;
};
779デフォルトの名無しさん:2010/01/25(月) 22:40:28
>>777
#include <numeric>
std::accumulate()
780デフォルトの名無しさん:2010/01/25(月) 22:46:35
トンクス
781デフォルトの名無しさん:2010/01/31(日) 00:31:44
for( Particles::iterator pi = ps->begin(); pi != ps->end(); ++pi )
{
for( Particles::iterator pj = ps->begin(); pj != ps->end(); ++pj)
{
         ・・・
}
}

このようにイテレータを作っているのですが、このままでは範囲がΣi(0〜N)Σj(0〜N)というふうに計算されるのですが
Σi(0〜N-1)Σj(i+1〜N)というふうに計算するにはどうおけばよいのかわからないので質問させていただきます。
782デフォルトの名無しさん:2010/01/31(日) 00:46:54
for( Particles::iterator pi = ps->begin(); pi != ps->end()-1; ++pi )
{
for( Particles::iterator pj = pi; pj != ps->end(); ++pj)
{
         ・・・
}
}
783デフォルトの名無しさん:2010/01/31(日) 00:57:05
>>782
ありがとうございます。
試してみます
784デフォルトの名無しさん:2010/01/31(日) 01:06:50
>>782
pj = pi + 1 じゃなくていいの?
785デフォルトの名無しさん:2010/01/31(日) 07:45:33
イテレータの種類はランダムアクセス可能なやつなのかどうなのか
ランダムアクセス不可ならstd::advance必須
786デフォルトの名無しさん:2010/01/31(日) 08:53:37
adavanceなんぞ使わんでも++pj != ps->end();で十分じゃね
787デフォルトの名無しさん:2010/01/31(日) 08:59:28
二つ前のレスも読めんのか馬鹿が
788781:2010/02/01(月) 00:47:17
遅れましたが>>782のように置いたのですがどうもうまくいかないみたいです。
789デフォルトの名無しさん:2010/02/01(月) 00:57:40
std::advanceってランダムアクセスイテレータの場合だけ別処理になったっけ?
790デフォルトの名無しさん:2010/02/01(月) 13:37:47
for( Particles::iterator pi = ps->begin(); pi != ps->end(); ++pi )
{
for( Particles::iterator pj = ps->begin(); pj != ps->end(); ++pj)
{
if(pi >= pj) continue;
         ・・・
}
}

で解決しました
791デフォルトの名無しさん:2010/02/01(月) 22:04:10
これはひどい
792デフォルトの名無しさん:2010/02/01(月) 22:59:55
>789
> 14882:2003 24.3.4p1
> Since only random access iterators provide + and - operators, the library provides two function templates
> advance and distance. These function templates use + and - for random access iterators (and are,
> therefore, constant time for them); (後略)
ってことでちゃんと別処理だね。
793デフォルトの名無しさん:2010/02/02(火) 14:12:46
ランダムアクセスイテレータは+と-オペレーターのみを提供するので、ライブラリーは二つの
関数テンプレートに前進と間隔を提供する。
それらの関数テンプレートは+と-をランダムアクセスイテレーターのために使う。
その結果それらの為にそれらの関数テンプレートは定数時間です。
794デフォルトの名無しさん:2010/02/02(火) 14:18:22
ああ、一箇所間違い発見、さてどこでしょう。
795デフォルトの名無しさん:2010/02/02(火) 14:19:59
のみ
796デフォルトの名無しさん:2010/02/02(火) 14:31:21
一箇所どころじゃねーだろ
797デフォルトの名無しさん:2010/02/02(火) 14:57:02
では2箇所ということで・・・
もう一つはどこでしょうか。
798デフォルトの名無しさん:2010/02/02(火) 21:21:30
2ちゃんに書いてしまったこと
799デフォルトの名無しさん:2010/02/03(水) 04:01:06
イテレータの種類による分岐はiterator_categoryの型による特殊化なのかな?
800デフォルトの名無しさん:2010/02/04(木) 05:11:30
>>799
VC9は

template<class _Iter> inline
typename iterator_traits<_Iter>::iterator_category _Iter_cat(const _Iter&)
{
typename iterator_traits<_Iter>::iterator_category _Cat;
return (_Cat);
}
template<class _InIt, class _Diff> inline
void advance(_InIt& _Where, _Diff _Off)
{
_Advance(_Where, _Off, _Iter_cat(_Where));
}
template<class _FI, class _Diff> inline
void _Advance(_FI& _Where, _Diff _Off, forward_iterator_tag);
以下input,bidirectional,random_access

だった。
801デフォルトの名無しさん:2010/02/04(木) 05:43:36
d
やっぱりiterator_categoryをタグにして特殊化してるんだね。
自作イテレーターの場合に気をつけよう。
802デフォルトの名無しさん:2010/02/04(木) 20:00:22
stlのapiリファレンスみたなものってある?

Javaで言うところのこういうやつ。
ttp://java.sun.com/j2se/1.5.0/ja/docs/ja/api/
803デフォルトの名無しさん:2010/02/04(木) 20:06:21
ttp://episteme.wankuma.com/stlprog/index.html

色々と間違ってるが
804デフォルトの名無しさん:2010/02/04(木) 23:57:40
>>802
一番正確なのは規格書。

日本語がいいなら、まだ不完全だけど、今ならここかな?
http://www.cppreference.com/wiki/jp/
805デフォルトの名無しさん:2010/02/05(金) 09:11:00
>>803-804
両者ありがとう!!!
感謝感激!!!
806デフォルトの名無しさん:2010/02/05(金) 19:00:53
vector<int>に対して、すべてのデータが負であるかを判定したい時に
簡単にかけるようなアルゴリズムってある?
(forallみたいなの)
807デフォルトの名無しさん:2010/02/05(金) 19:03:09
全部掛け算して負だったらどう?
808デフォルトの名無しさん:2010/02/05(金) 19:03:56
MSB の and
809デフォルトの名無しさん:2010/02/05(金) 19:05:42
-1,1,1の場合にだめじゃん
そういうんじゃなくて
struct NEG{
bool operator()(int n){return n<0;}
};
こういう関数オブジェクトがあれば
forall(v.begin(),v.end(),NEG());
こんな感じで呼び出せばtrueがかえる、みたいな感じの
810デフォルトの名無しさん:2010/02/05(金) 19:31:54
find_if()に負判定の動詞を食わせたら?
811デフォルトの名無しさん:2010/02/05(金) 19:51:46
あ、それいいですね。thx
812デフォルトの名無しさん:2010/02/06(土) 03:51:15
>>808が一番いいな
813デフォルトの名無しさん:2010/02/06(土) 08:12:31
MSBだけ取り出してANDするよりも
とりあえず全データANDしておいて
最後にMSBだけチェックした方が
全体のコストが減るのでは?
814デフォルトの名無しさん:2010/02/06(土) 08:26:15
負ゼロはどうすんの
815デフォルトの名無しさん:2010/02/06(土) 08:37:45
vector<int>に対して
816デフォルトの名無しさん:2010/02/06(土) 08:46:10
>>813
処理系やデータによるとしか。
例えば、できるだけ早く探索を打ち切ったほうが、キャッシュミスが減って速くなるかもしれない。
例えば、処理するデータの正数出現率に片寄りがあるかもしれない。
817デフォルトの名無しさん:2010/02/09(火) 18:54:18
VS2010beta使ってて、stack<T>にemplaceってメンバがあるんだけどこれって何者?

818デフォルトの名無しさん:2010/02/09(火) 19:19:09
テンプレ−トタイプ(T)のmoveコンストラクタ呼び出し版のpushかな
819デフォルトの名無しさん:2010/02/09(火) 19:33:30
なるほど、どうりで検索してもヒットしないわけだ、ありがとう
820デフォルトの名無しさん:2010/02/13(土) 03:44:41
C++0xの記事がヒットするんじゃねぇの
821デフォルトの名無しさん:2010/02/14(日) 15:28:11
次のような比較関数を書こうとして必要になったんですが
bind3rdってないんですよね

struct sorter:binary_function<T,T,bool>{
bool operator()(const T&lhs,const T&rhs)const{
return distance(lhs,x)<distance(rhs,x); //このxを第3のパラメータにしたい
}
};

//こんな感じで使いたかった
sort(v.begin(),v.end(),bind3rd(sorter(),v[0]));
こういう場合いい方法ってありますか?
822デフォルトの名無しさん:2010/02/14(日) 15:34:38
>>821 sort(v.begin(),v.end(),boost::bind(sorter(),_1,_2,v[0]))
823デフォルトの名無しさん:2010/02/14(日) 16:45:07
別にbindする必要なくね?

struct sorter:binary_function<T,T,bool>{
const T &t_;
sorter( const T &t ) : t_(t){}
bool operator()(const T &lhs, const T &rhs) const{
return distance( lhs, t_ ) < distance( rhs, t_ );
}
};

sort( v.begin(), v.end(), sorter(v[0]) );
824デフォルトの名無しさん:2010/02/14(日) 20:19:34
目からウロボロスでした。助かります
825デフォルトの名無しさん:2010/02/15(月) 00:37:58
ファンクターの保持、コピー、使用のタイミングはそれぞれ規定がないから
ファンクター内で凝った副作用をさせないようにね。
826デフォルトの名無しさん:2010/02/15(月) 23:23:16
一年くらい前と同じ話題を振るとはなかなかやるな
827デフォルトの名無しさん:2010/02/15(月) 23:38:19
そういや結構長持ちしてるんだなこのスレ。
828デフォルトの名無しさん:2010/02/16(火) 01:16:29
valarrayの質問はどこでしたらいいですか?
829デフォルトの名無しさん:2010/02/16(火) 01:26:39
標準でテンプレートによるライブラリだからここでもいいだろうしC++相談室でもいいだろうし。
830デフォルトの名無しさん:2010/02/18(木) 00:34:47
std::sprintfおせーぞ

なんとかしろや
831デフォルトの名無しさん:2010/02/18(木) 01:42:19
STLじゃねーよ
速度クリティカルなところでsprintfなんて使うな
832デフォルトの名無しさん:2010/02/18(木) 02:14:09
律儀だな
833デフォルトの名無しさん:2010/02/18(木) 03:33:02
ん、じゃー何を使えばいい?
そもそも速度が要求される所で、文字列をこねくり回すのが間違い?
834デフォルトの名無しさん:2010/02/18(木) 06:37:16
printf/sprintfは内部で使用メモリやらCPUリソースやらがものすごい事になってるんで
デバッグや速度必要なところでは使うなよ
835デフォルトの名無しさん:2010/02/18(木) 06:44:42
かといって代わりのコード書くとなると ものすごい事になるし
836デフォルトの名無しさん:2010/02/18(木) 06:47:10
フォーマットする部分が酷いんだからそこを特殊化すればよろし
837デフォルトの名無しさん:2010/02/25(木) 20:38:11
コンテナを受け取るtemplate<class T>で、コンテナタイプで特殊化したい場合は
T::container_categoryでできますが、イテレータ型を受け取る場合は同じことって不可能でしょうか?
838デフォルトの名無しさん:2010/02/25(木) 23:40:36
std::iterator_traits<T>::iterator_category
839デフォルトの名無しさん:2010/02/26(金) 09:53:12
iterator_categoryで分かるのはランダムアクセスとかで、コンテナの種類が正確には分からないのでは?
840デフォルトの名無しさん:2010/02/26(金) 10:24:56
std::vector<T>::iteratorとかでオーバーロードするんじゃね
841デフォルトの名無しさん:2010/02/26(金) 17:43:17
一般にイテレータ型からコンテナ型の導出はできない。
例えばイテレータの実装が単にポインタだったらコンテナは?
842デフォルトの名無しさん:2010/02/26(金) 19:49:02
traits
843デフォルトの名無しさん:2010/02/27(土) 02:10:41
>コンテナタイプで特殊化したい場合はT::container_categoryで〜
ってのがあんまり意味が呑み込めないというか
iterator_categoryみたいにタグディスパッチでオーバーロードするって話なのか?
ってかcontainer_categoryってSTLにあったっけ?
boostのcontainer_traitsでそんなようなのものを見た記憶があるけど
844デフォルトの名無しさん:2010/03/04(木) 10:42:40
質問です。

std::set<std::string>を使おうとすると、どうしてもエラーになってしまいます。

std::set<std::string> s;
s.insert("1");

setとstringは組み合わせられないのでしょうか?
set<int>などは普通に使えているのですが…。
環境はVS2008です。
845デフォルトの名無しさん:2010/03/04(木) 10:45:15
>>844 エラーメッセージは?
846デフォルトの名無しさん:2010/03/04(木) 10:47:42
すいません。#include <string>していなかっただけでした…
STLのエラーメッセージはわかりづらいよ…(自分が悪い)
847デフォルトの名無しさん:2010/03/06(土) 12:32:45
コンテナの内容を表示するこんなマクロを書いたんですが
tを入力しなくてもよいように出来たりしますか?
#define SHOW(v,t,sep) copy((v).begin(),(v).end(),ostream_iterator<t>(cout,sep));cout << endl
848デフォルトの名無しさん:2010/03/06(土) 13:03:46
template <typename T>
void Show(const T &v, const std::string &sep)
{
std::copy(v.begin(), v.end(), std::ostream_iterator<typename T::value_type>(std::cout, sep.c_str()));
std::cout << std::endl;
}
849デフォルトの名無しさん:2010/03/06(土) 13:36:09
マクロ使うにしてもブロックで囲むか
セミコロンをカンマに変えないと下のように書いたとき
意図しない動作になるよ

if(〜) SHOW(〜);
850デフォルトの名無しさん:2010/03/06(土) 20:01:23
単純にブロックで囲むとそれはそれで問題なので do { /* */ } while(0) が普通。
851デフォルトの名無しさん:2010/03/06(土) 22:10:19
>>848-850
とても参考になりました、ありがとうございますAll
852デフォルトの名無しさん:2010/03/07(日) 16:12:09
双方向イテレータはどうしてランダムアクセス出来ないんですか?
前方と後方に自由に進めるならランダムアクセスできると思います。
853デフォルトの名無しさん:2010/03/07(日) 16:13:39
>>852 計算量が違う。
854デフォルトの名無しさん:2010/03/07(日) 16:19:39
計算量が多くてもランダムアクセスできた方が便利なのに
あえて出来ないようにして何か得があるんですか?
855デフォルトの名無しさん:2010/03/07(日) 16:24:03
std::advanceで出来るでしょ
単に[]演算子を提供してないだけで、
それはわざとそういう設計になってる
856デフォルトの名無しさん:2010/03/07(日) 16:27:21
>>854
特定の利用ケースでそのほうが便利なのであれば、ランダムアクセスできるかのような
インターフェースをかぶせることはプログラマの自由。

一般的には、計算量を無視することは不適切。
857デフォルトの名無しさん:2010/03/07(日) 16:34:12
ありがとうございます。
ランダムアクセスと双方向イテレーターを分ける
計算量ってどれくらいですか?
858デフォルトの名無しさん:2010/03/07(日) 16:55:22
>>857 ランダムアクセスが O(1) で双方向がコンテナのサイズ N に対して O(N) 。
859デフォルトの名無しさん:2010/03/07(日) 16:56:03
O(1) とは言っても償却定数時間が許されていたかもしれない。
860デフォルトの名無しさん:2010/03/07(日) 17:08:05
1とNの間はどっちにしたらいいですか?
861デフォルトの名無しさん:2010/03/07(日) 17:13:43
>>860 日本語でおk
862デフォルトの名無しさん:2010/03/07(日) 17:49:26
酸素とオゾンだろ常識的に考えて
863デフォルトの名無しさん:2010/03/07(日) 17:51:11
N/2とかは?
864デフォルトの名無しさん:2010/03/07(日) 17:56:47
あと計算量がインデックスに依存する場合も教えてください。
865デフォルトの名無しさん:2010/03/07(日) 18:10:28
宿題っぽいな
866デフォルトの名無しさん:2010/03/07(日) 18:13:29
867デフォルトの名無しさん:2010/03/07(日) 18:18:19
どんだけ人に頼ってんだよアホか
868デフォルトの名無しさん:2010/03/07(日) 21:03:34
>>854
君が その遅いランダムアクセス子を知らずに使ってしまうからだよ
869デフォルトの名無しさん:2010/03/08(月) 12:28:13
その前にO(N)とかの意味がわかっていないような・・・
870デフォルトの名無しさん:2010/03/08(月) 12:52:28
>>868
>ランダムアクセス子
イテレータにもキャラ化の波が。w
871デフォルトの名無しさん:2010/03/08(月) 12:55:05
>>863
O(N/2)=O(N)
これがわからなければでなおせ。

872デフォルトの名無しさん:2010/03/08(月) 13:09:14
f(N) が O(g(N)) とは
  N>M ならば f(N) < C g(N)
となるような M と C が存在すること?
873デフォルトの名無しさん:2010/03/08(月) 13:12:08
874デフォルトの名無しさん:2010/03/08(月) 13:14:03
>>872
なんかよくわかんないんだけど、計算量の話じゃなさそうだから、たぶんちがう。
875デフォルトの名無しさん:2010/03/08(月) 13:14:54
Taylor展開の剰余項みたいのをイメージしろ。
876デフォルトの名無しさん:2010/03/08(月) 13:16:23
873は何をいいたいのだろうか
877デフォルトの名無しさん:2010/03/08(月) 13:18:01
O(N^(1/2))などは1とNの間だろ?
878デフォルトの名無しさん:2010/03/08(月) 13:22:17
ああ、NとN/2が同じってことがわかんない人につっこんでんじゃなくて
1とNの間の話ね
lognとかもそうだな
879デフォルトの名無しさん:2010/03/08(月) 13:28:40
元の質問の話なら
> 1とNの間はどっちにしたらいいですか?
「どっち」かじゃないとダメなんじゃね?
880デフォルトの名無しさん:2010/03/08(月) 14:56:30
そんなわけないだろ、
ツリー構造みたいなのだとlogじゃね?
881デフォルトの名無しさん:2010/03/08(月) 16:40:13
なんだか高度そうなお話しているとこ申し訳ないのですが、
「最後の要素を指すiteratorを取得する」方法はありますでしょうか?
現在のところ…。

list<int> m;
m.push_back(1);

list<int>::iterator it;
it = m.end();
--it;
// これで、iteratorが最後の要素を指すようになったぞ

とやっているのですが…。
push_backは返り値を返しませんし、backは参照を返されるので、末尾のiteratorを得るにはこれしかないのかなと
882デフォルトの名無しさん:2010/03/08(月) 17:05:10
m.rbegin();
883デフォルトの名無しさん:2010/03/08(月) 18:00:34
なるほど!
ありがとうございます
884デフォルトの名無しさん:2010/03/09(火) 05:18:44
&m.back()でよくね。
ポインタもイテレータさ!って感じで使ってもSTL的には困らないし
885デフォルトの名無しさん:2010/03/09(火) 05:47:52
list<int> m;
int const *it = &m.back();
while(++it != m.end());
こうですかわかりません
886デフォルトの名無しさん:2010/03/09(火) 08:18:31
>>882
違わくね?w
887デフォルトの名無しさん:2010/03/09(火) 09:55:09
相談室の質も落ちたな・・・
間違いだらけじゃねーか
888デフォルトの名無しさん:2010/03/09(火) 10:36:49
>>887 間違いだらけ? >884 のほかに何かあるか?
889デフォルトの名無しさん:2010/03/09(火) 13:01:28
ツリー構造のコンテナのイテレーターは何イテレーターが適していますか?
890デフォルトの名無しさん:2010/03/09(火) 13:08:52
>>888
iteratorがポインタで実装されているという保証は一切ない
891デフォルトの名無しさん:2010/03/09(火) 13:24:36
>>888は884が間違ってるって指摘だろ
それは884の内容じゃん
892デフォルトの名無しさん:2010/03/09(火) 13:47:14
俺も「>884のほかに(やりかた)何かあるか?」という意味でとれた
893デフォルトの名無しさん:2010/03/09(火) 14:19:46
>>892
それはちょっと自身の読解力に不安を持ったほうがいいレベル
894デフォルトの名無しさん:2010/03/09(火) 14:21:28
>>889
選ぶとすればbidirectional_iteratorかなぁ
たとえばinorderならrootから左右にすすめるコンテナとみなせるわけだし
tree<int,sorter=less<int>,order=inorder<int> > t;
木もSTLにあったら良いのに
895デフォルトの名無しさん:2010/03/09(火) 14:23:25
list<int>::iterator it = --m.end();
881 を見て、一行で書くとこうなるのかなと思ったのですが
これだと RVO は効かなくなるのでしょうか?
896デフォルトの名無しさん:2010/03/09(火) 15:32:57
Nに関係なく定数ならランダムイテレーター
それ以外は双方向イテレーターでいいですか?
コンテナのインデックスがIとしてO( I )とかO( I^2 )は
双方向かランダムどっちですか?
897デフォルトの名無しさん:2010/03/09(火) 15:40:05
>>896
そんなオーダーはない。
平均するか最悪の場合を考える。

O(N)かそれより大きければ基本bidirectionalじゃね?
898デフォルトの名無しさん:2010/03/09(火) 15:40:23
日本語でおk
899デフォルトの名無しさん:2010/03/09(火) 20:22:47
>>896
一方向イテレータもある。
900デフォルトの名無しさん:2010/03/09(火) 20:24:22
>>889
仕様と実装による。
普通は、イテレータにあわないと思う。
901デフォルトの名無しさん:2010/03/09(火) 20:59:43
どこかでみたなツリーのイテレータ
幅優先か深さ優先かで二つ定義されてた記憶が
902デフォルトの名無しさん:2010/03/09(火) 22:34:22
tree.hhを思い出した
903デフォルトの名無しさん:2010/03/10(水) 01:26:34
std::map の内部とかで 使われてなかったっけ? xtree か何かそんな感じの
あれってイテレータ持ってなかったっけ

あったなぁ tree.hh
GPL だったから使わなかったけど、すごい参考になった
904デフォルトの名無しさん:2010/03/10(水) 01:38:36
tree.hhってのが何かしらないけど
自分でツリー書いて幅か深さ、必要なのをtemplateでtag受け取って特殊化して組めばいいだけの話ではないの?
905デフォルトの名無しさん:2010/03/10(水) 11:52:52
tree.hhも知らないなんてダッセ〜
906デフォルトの名無しさん:2010/03/10(水) 12:52:13
あれ?tree.hhってGPLだったっけ?
907デフォルトの名無しさん:2010/03/10(水) 18:46:46
不審なファイルはGPLだと思って扱った方がいい
感染ってからじゃ遅い
908デフォルトの名無しさん:2010/03/10(水) 20:04:46
Boost.PropertyTreeはどうなっているんだろう?
あれも構造としては木だけど。
909デフォルトの名無しさん:2010/03/10(水) 21:27:10
tree.hh使わないとツリーも実装できないなんてダッセー
910デフォルトの名無しさん:2010/03/11(木) 00:56:36
B木とか赤黒木とか自分で書きたくないです
911デフォルトの名無しさん:2010/03/12(金) 15:10:37
プログラム素人がプロの書いたコードに勝てるわけ無いだろw
おとなしく権威には従えよ
912デフォルトの名無しさん:2010/03/12(金) 18:14:47
プログラム素人が「初心者」って意味なら勿論勝てるわけないし、
有名どころのライブラリを書いてるプロが優秀なのも言わずもがなだが、

もしそのついでにアマチュア全般とプロ全般を比較したがっているなら、
これについては、コードの品質とは殆ど関係無い。
913デフォルトの名無しさん:2010/03/12(金) 21:05:18
プログラム素人が「初心者」
でないとしていきなり
アマチュア全般
ですか
おめでたいですね
914デフォルトの名無しさん:2010/03/12(金) 21:16:08
5行も使って読解力の無さをアピールされても・・・。
いきなりというなら、いきなりプログラム素人とか言い出す人が問題なんだよ。
915デフォルトの名無しさん:2010/03/12(金) 21:20:37
>>911 が書いていないことを勝手に >>912 で補完して攻撃する馬鹿
916デフォルトの名無しさん:2010/03/12(金) 21:25:37
また読解力の無い馬鹿が湧いてきた。
917デフォルトの名無しさん:2010/03/12(金) 22:32:45
>>910
いや実用的な物は書けないかもしれないが
後学のために実験プログラムを書くことは、赤黒木のソースを
読むときに大いに役立つぞ
918デフォルトの名無しさん:2010/03/13(土) 05:33:18
setの要素をファイルに書き出して、またsetに読み込めるような関数を作ったんだ。
そこでiteratorが指す位置も保存して、また復元できるようにしたい。でもできない。
助けてくださいエロい人。
919デフォルトの名無しさん:2010/03/13(土) 06:00:14
>>918
なにを試して「できない」と判断したの?
920デフォルトの名無しさん:2010/03/13(土) 06:10:10
iteratorそのものを保存するんじゃ無理だろ。
何回++したらendと等しくなるかとかを保存しないといけないんじゃねーの

意外と面倒臭いなこれ……
921デフォルトの名無しさん:2010/03/13(土) 09:59:02
キーとして機能してる値を保存じゃダメなのかい
922デフォルトの名無しさん:2010/03/13(土) 10:51:05
そもそもsetは、あまりiteratorを介してアクセスするものじゃないよね。
どちらかというと全体で一塊で意味のあるようなデータだし。

問題のiteratorの保存/復元だが、値を保存して読み込むときにfindでいいと思う。
923デフォルトの名無しさん:2010/03/13(土) 12:43:20
>>918
distance と advance を使ってできることとは違うのかな?
924デフォルトの名無しさん:2010/03/20(土) 15:37:52
vectorのoperator[]の計算量は定数時間だと思っていたが
正しくは償却定数時間なんだな
925デフォルトの名無しさん:2010/03/20(土) 18:48:42
要素の参照得るだけなのにそれマジソース総力
926デフォルトの名無しさん:2010/03/20(土) 19:33:23
C++2003の仕様書の470ページ
927デフォルトの名無しさん:2010/03/21(日) 13:31:44
実装としてどんなのを想定してるんだろ。
928デフォルトの名無しさん:2010/03/21(日) 13:33:56
バッファの連続性保証がなかった頃の名残なのかな
929デフォルトの名無しさん:2010/03/21(日) 15:23:09
vectorの中身が配列とは規定されてはないからね。
930デフォルトの名無しさん:2010/03/21(日) 19:43:15
>>927
実際にアクセスされるまでメモリの確保が遅延されるシステムとか
931デフォルトの名無しさん:2010/03/22(月) 09:44:06
単純なコピーオンライト実装だと 非const[]時に償却時間がかかる
932デフォルトの名無しさん:2010/03/23(火) 19:19:48
>>931
コピーオンライトは、stringだったら
かなりの値打ちだと思うけど、
vectorだったらやりすぎだと感じるな。
933デフォルトの名無しさん:2010/03/27(土) 18:41:15
std::stackにclear()は無いんですね
空にしたい場合こうやるよりほかにやり方はありますか?
while(!s.empty()){s.pop();}
934デフォルトの名無しさん:2010/03/27(土) 18:53:46
s = std::stack<T>();
935デフォルトの名無しさん:2010/03/27(土) 19:18:31
メモリが開放されて欲しいか否かによるね
開放されて欲しくない場合は正攻法は>>933しかない
reinterpret_cast<std::deque&>(s).clear(); なんて鼻から悪魔な邪道もあるけど
そんな事するくらいなら最初からdeque使った方がいい
936デフォルトの名無しさん:2010/03/27(土) 19:56:24
>>934
stackってコピー演算子定義されたたのか。これはいいこと知った。
937デフォルトの名無しさん:2010/03/27(土) 19:57:49
Container c が protected だから継承すれば中のやつもいじり放題。
938デフォルトの名無しさん:2010/03/27(土) 20:00:57
>>935
それ動くのか?
むしろ、それが機能するstackは使いたくないな。
939デフォルトの名無しさん:2010/03/27(土) 20:11:16
stackはdequeをメンバに持って
そのメンバ関数呼んでるだけだぜ
他のコンテナを使う事もできるが、デフォルトはdeque
940デフォルトの名無しさん:2010/03/27(土) 20:14:07
なんでSTLとかBoostって命名規則小文字だらけなの?

かっこいいけど。
941デフォルトの名無しさん:2010/03/27(土) 20:34:44
Shiftとか小指疲れるし
942デフォルトの名無しさん:2010/03/27(土) 20:35:44
SHIFTを押すときに指がつってえらいことになったから
943587:2010/03/27(土) 20:52:24
“_”もShift使うんじゃない?位置も酷いし。
SpaceShift使うとか工夫すれば良いのにねぇ。
944デフォルトの名無しさん:2010/03/27(土) 20:53:45
>>939
>他のコンテナを使う事もできるが、デフォルトはdeque

じゃあ実際に何のコンテナを使っているかわからなければ

>reinterpret_cast<std::deque&>(s).clear();

なんて出来ないね
945デフォルトの名無しさん:2010/03/27(土) 22:16:16
そりゃそうだが、何のコンテナを使うかを指定するのはユーザだから、分からないなんてことはない
型引数にだって残るわけだし
946デフォルトの名無しさん:2010/03/27(土) 22:22:46
そういう考え方はバグの元
プログラマが管理する物を減らさないとそのうち手に終えなくなるぞ
947デフォルトの名無しさん:2010/03/27(土) 22:46:39
使ってるコンテナの型はstackがContainerって名前で持ってるから
948デフォルトの名無しさん:2010/03/27(土) 22:47:38
>>935
解放されて欲しいじゃなくて、解法されて欲しくない場合か、なるほど
そうなると、速度的にはどちらが有利なんだろう
949デフォルトの名無しさん:2010/03/27(土) 22:48:12
container_typeだった
950デフォルトの名無しさん:2010/03/27(土) 22:54:50
>>948
どちら、って何と何を比べての話?
951デフォルトの名無しさん:2010/03/27(土) 23:06:25
>>947
大文字の時点で標準じゃ無いだろう。
内部のコンテナを使って欲しいならそれなりのメンバ関数なりtypedefがあるんじゃね?
reinterpret_castは悪い冗談だ。
952デフォルトの名無しさん:2010/03/27(土) 23:52:48
reinterpret_cast に関しては鼻から悪魔って言ってるじゃないかw そこでマジにならないで
953デフォルトの名無しさん:2010/03/27(土) 23:58:23
>>951
だからcontainer_typeだってば
規格書にもちゃんと書かれてる歴とした標準のtypedef

直接触りたければ内部コンテナは「c」っていう名前でprotectedになってるから
継承して触ることも出来る
954デフォルトの名無しさん:2010/03/28(日) 00:06:59
cも規格で決められてるのね

ただ仮想デストラクタでないクラスを継承するのもねえ
private継承なら安全だけどstackにアップキャストできないし
955デフォルトの名無しさん:2010/03/28(日) 00:13:59
>>953
そんなDirtyな事はしたくないなあ
そこまでして自分の意見を通したいのか
956デフォルトの名無しさん:2010/03/28(日) 00:19:55
LIFO以外の操作したい、clear()がないとダメというのなら
それはstackがそもそも適していないということでは
957デフォルトの名無しさん:2010/03/28(日) 00:21:57
>>955
したくないなあ、って誰もやれとは言ってないぞ
自分の意見を通したいのは君自身じゃね?
自分も規格書見て確かめたよ
958デフォルトの名無しさん:2010/03/28(日) 00:23:29
コンテナにdeque以外が指定されてたらどうすんだ
959デフォルトの名無しさん:2010/03/28(日) 00:24:01
>>957
だったら書くなよ
960デフォルトの名無しさん:2010/03/28(日) 00:24:58
>>956
stack<hoge> s;
s=stack<hoge>()がスマートかな
961957:2010/03/28(日) 00:27:37
>>959
俺は>>953じゃねえよw
962デフォルトの名無しさん:2010/03/28(日) 00:27:56
>>960
記法で代替できるかじゃなくて、選択したデータ構造が
stackである必然がないんじゃないかって話
端的にいえばdeque使えよってだけ
963デフォルトの名無しさん:2010/03/28(日) 00:29:11
>>961
IDが出ないんだから何とでも言えるわな
964デフォルトの名無しさん:2010/03/28(日) 00:31:01
>>958
言っておくが、コンテナの種類はテンプレート引数から指定するんだぞ
そしてデフォルト引数がdequeなのは規格で決まっている
965デフォルトの名無しさん:2010/03/28(日) 00:32:54
stackにpush、pop以外にclearが欲しいという気持ちは分かるが
966デフォルトの名無しさん:2010/03/28(日) 08:16:51
規格上可能かどうかの話と、推奨されるかどうかの話がごっちゃになってるな
967デフォルトの名無しさん:2010/03/28(日) 08:45:26
自分で付け足せばいい

#include <stack>

template <typename T, typename Seq = std::deque<T> >
class my_stack : protected std::stack<T, Seq> {
private:
 typedef std::stack<T, Seq> base;
public:
 using base::value_type;
 using base::reference;
 using base::const_reference;
 using base::size_type;
 using base::container_type;
 explicit my_stack(const Seq& c = Seq()) : base(c) { }
 using base::empty;
 using base::size;
 using base::top;
 using base::push;
 using base::pop;
 void clear() { base::c.clear(); }
};
968デフォルトの名無しさん:2010/03/28(日) 09:10:17
デストラクタ
969デフォルトの名無しさん:2010/03/28(日) 09:20:36
デフォルトでいいだろ
970デフォルトの名無しさん:2010/03/28(日) 09:34:11
そういうこっちゃな
Stackアダプタぐらい自作した方が良い
971デフォルトの名無しさん:2010/03/28(日) 09:37:49
STLのコンテナって継承していいんだっけ
972デフォルトの名無しさん:2010/03/28(日) 09:38:36
>>971
基本ダメ
仮想デストラクタがない
973デフォルトの名無しさん:2010/03/28(日) 09:44:36
コンテナアダプタはおk?
974デフォルトの名無しさん:2010/03/28(日) 09:47:51
だって継承ないじゃん
単にガワを被せただけ
コンポジションに近い
975デフォルトの名無しさん:2010/03/28(日) 09:52:44
ちょっと質問の仕方に問題があった
デストラクタが仮想でないことに気をつければ
コンテナアダプタは継承しても問題ないよね
976デフォルトの名無しさん:2010/03/28(日) 09:59:34
>>972
そこは public 継承じゃなけりゃ問題にならんだろ。
977デフォルトの名無しさん:2010/03/28(日) 10:13:34
>>976
public継承しなければコンパイルエラーになるだろ
978デフォルトの名無しさん:2010/03/28(日) 10:30:51
>>977 何が?
979デフォルトの名無しさん:2010/03/28(日) 10:37:45
コンストラクタとデストラクタのあるクラスをprivate継承すると
コンパイルできない
980デフォルトの名無しさん:2010/03/28(日) 11:20:39
んなこたぁない
981デフォルトの名無しさん:2010/03/28(日) 11:38:43
できねえよ
試してみろよ
コンストラクタにアクセスできませんって叱られる
982デフォルトの名無しさん:2010/03/28(日) 11:44:05
こんな簡単なプログラムでもコンパイルできないよ

class A {
A() {}
~A() {}
};

class B : A {
B() {}
~B() {}
};

int main()
{
B b;
}
983デフォルトの名無しさん:2010/03/28(日) 11:46:09
>>982
あったりまえだろう。Bのコンストラクタ、デストラクタがprivateになっとるだろうが。
皆が言ってるのはこうでしょ。
class A {
public:
A() {}
~A() {}
};

class B : private A {
public:
B() {}
~B() {}
};

int main()
{
B b;
}
984デフォルトの名無しさん:2010/03/28(日) 11:55:08
アホすぎて吹いた
985デフォルトの名無しさん:2010/03/28(日) 13:32:57
http://codepad.org/gY3ZGcBq
問題無い?
986デフォルトの名無しさん:2010/03/28(日) 13:38:51
No problem
987デフォルトの名無しさん
>>967でもpublic継承したいところを
涙を飲んでちゃんとprotected継承してるでしょ