- 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 以降
- 101 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:10:40 ]
- 日本語でおkとなった
- 102 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:58:34 ]
- これだから関数型言語のひとつも使えない連中は以下略
- 103 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 02:04:14 ]
- >>86>>100
Boost.Lambdaのconstantは望むものと違う?
- 104 名前:デフォルトの名無しさん [2008/01/10(木) 23:19:46 ]
- a
- 105 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 13:33:47 ]
- b
- 106 名前:デフォルトの名無しさん [2008/01/11(金) 14:01:47 ]
- 初歩的な質問で申し訳ないのですが
class sample{ public: vector<int> vector_int; list<double> list_double; 〜省略〜 } というようなクラスをnew演算子で動的に生成した場合、delete演算子で解放 する際にはメンバのvectorやlistのメモリも解放されるのでしょうか。 ご教授お願いします
- 107 名前:デフォルトの名無しさん [2008/01/11(金) 14:11:45 ]
- >>106
される. 安心して使いたまえ.
- 108 名前:デフォルトの名無しさん [2008/01/11(金) 14:18:33 ]
- >>107
ご教授ありがとうございます。 また質問で恐縮なのですが関連して、メンバを vector<int> *p_vector_int とし、コンストラクタ内で動的にメモリ確保したとすると、この場合はデストラクタ内 で解放するように定義しとかなければいけないのでしょうか?
- 109 名前:別人 mailto:sage [2008/01/11(金) 14:42:35 ]
- >>108
そのとおり、でも sample a; sample b = a;//もしくはsample b(a); これでデストラクタが呼ばれると同じポインタを複数回deleteしたりする未定義動作になるから注意してね。
- 110 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 14:49:55 ]
- >>108
コンテナをnewするなんて糞みたいなことはやめたまえ。
- 111 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:00:28 ]
- >>109
>>110 ありがとうございます。 確かにコンテナをnewで確保するっていうのも変な話かも知れないです。 動的なメモリ確保・解放っていうのがintやdoubleといったような基本的な 型でしか情報が見つからなかったので、クラスや可変長配列の場合どうなるのか、 モヤモヤしていたんですが、すっきりしました。ありがどうございました。
- 112 名前:デフォルトの名無しさん [2008/01/11(金) 15:05:27 ]
- >>108
解放忘れが気になるなら, std::auto_ptr を使うといいよ.
- 113 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:06:50 ]
- >>112
調べてみます。ありがとうございます
- 114 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:08:25 ]
- auto_ptrなんて落とし穴満載の使いづらいのを進めるなよ。
- 115 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:10:54 ]
- >>114
そこらへんは、自分で判断しますので大丈夫ですよ・・・きっとw
- 116 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:19:07 ]
- >>108
boost::shared_ptr (or boost::scoped_ptr) boost::shared_ptr<std::vector<int> > sp_vector_int;
- 117 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:24:57 ]
- >>111
動的確保する為のコンテナを、動的確保なんて「例」だとしても阿呆過ぎる。
- 118 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:30:23 ]
- 大量に複数のコンテナを用意する場合、コンテナのメンバ変数に
メモリが圧迫されることがあるので、newするケースもあると思うがなぁ。
- 119 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:34:45 ]
- Container<Container<Type> >
- 120 名前:デフォルトの名無しさん [2008/01/11(金) 15:49:21 ]
- >>114
だって,boost のビルドからしろって勧めるのも気が引けるじゃないか.
- 121 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:03:12 ]
- >>120
いや、なるべくbestの回答をするのが親切だと思う。
- 122 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:07:43 ]
- boost::shared_ptrはboostの他のライブラリに依存しない設計方針らしい
- 123 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:13:54 ]
- ビルドが必要なのは実装依存のコンポーネントだな。
thread関連とかasio(まだ無いが)とか。 shared_ptrなんぞバイナリー落としてインストールするだけだ。
- 124 名前:デフォルトの名無しさん [2008/01/11(金) 17:24:46 ]
- >>123
それを言うならヘッダファイルジャマイカ?
- 125 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:09:22 ]
- C++相談室どこいった?
- 126 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:15:35 ]
- 落ちた
- 127 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:23:18 ]
- 996レスくらいだっけ? ぎりぎりで落ちたよね。
- 128 名前:デフォルトの名無しさん [2008/01/11(金) 18:31:41 ]
- イテレータって何ですか?
- 129 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:03:45 ]
- >>124
ヘッダもだけどライブラリじゃなくてか?
- 130 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:06:44 ]
- shared_ptrはもう導入しないでどうするという感じだな
天才が作ってるうえアフォな質問にも丁寧に答えてくれるしな boostの問題はライブラリによってサポートに差があることかな
- 131 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:18:34 ]
- >>130
次期 C++ で導入されるよ
- 132 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:05:28 ]
- TR1に入ってるものは全部C++0xで標準に入るんだよな。
shared_ptr weak_ptr bind function mem_fn type_traits...
- 133 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:09:01 ]
- regex とか random とか tuple とかも入るよ。
んで、auto_ptr は deprecated になる。
- 134 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:01:32 ]
- >>117
まぁ そうですね。clear()呼べば済む話ですもんね お騒がせしました。
- 135 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:06:37 ]
- auto_ptr、deprecatedになるのかw
カワイソス strstreamみたいな感じか
- 136 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:16:13 ]
- 破壊的だと使い勝手悪いしなあ。
- 137 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:30:29 ]
- コンテナに入れられないのがよほど致命的なんだろ。
- 138 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:32:59 ]
- 致命的過ぎるよなー、それ。
- 139 名前:デフォルトの名無しさん [2008/01/11(金) 22:07:12 ]
- >>129
いやぁ,shared_ptr だけならヘッダファイルだけ もってくればつかえるとオモタ.
- 140 名前:デフォルトの名無しさん [2008/01/11(金) 22:08:03 ]
- で auto_ptr の直接の代わりは scoped_ptr ?
- 141 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 22:28:42 ]
- そんなもん使わずに shared_ptr 使えって事だ。
- 142 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:06:56 ]
- auto_ptrはreleaseできるのが地味に便利
- 143 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:09:13 ]
- 参照カウンタのオーバーヘッドを気にしてしまう人もいるんじゃないか たぶん
- 144 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:16:19 ]
- boost::ptr_vectorは地味に便利だ
- 145 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:16:32 ]
- unique_ptrが楽しみ
- 146 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:24:31 ]
- 参照カウンタ込みで new できるとオーバーヘッドも小さいんだが。
汎用的に作れないもんかね。
- 147 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 00:04:47 ]
- >>146
intrusive_ptrではだめなの?
- 148 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 00:13:08 ]
- >>147
使うために色々と必要な事があるからなあ。
- 149 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:04:36 ]
- multimapのいくつかの要素を述語を使って消去したいのですが
何か良い方法はありますか? bool pred(pair<int, int> v) { return v.first == 3 && v.second == 'c'; } int main(int argc, char* argv[]) { multimap<int, char> m; m.insert(make_pair(1,'a')); m.insert(make_pair(2,'b')); m.insert(make_pair(3,'c')); // 消去したい m.insert(make_pair(3,'c')); // 消去したい m.insert(make_pair(3,'d')); m.insert(make_pair(4,'d')); m.erase(???); return 0; } 環境はVC8です。
- 150 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:05:36 ]
- 149です。
bool pred(pair<int, int> v) のところは bool pred(pair<int, char> v) の間違いでした。 お願いします。
- 151 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:14:10 ]
- イテレータとfor_eachじゃね?
- 152 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:38:42 ]
- >>151
Effective STL Item9 や JosuttisのSTL本にも載ってるけど こんな感じだろうか。 bool pred(const pair<int, char>& v) { return v.first == 3 && v.second == 'c'; } for(multimap<int, char>::iterator it = m.begin(); it != m.end(); ) { if( pred(*it) ) { m.erase(it++); } else { ++it; } } 試してはいない。
- 153 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:52:44 ]
- >>152
begin()とend()じゃなくて、lower_bound()とupper_bound()の方がいいと思う。
- 154 名前:149 mailto:sage [2008/01/13(日) 20:56:22 ]
- >>152
お示しの方法でうまくいきました。 >151,152 ありがとうございました。
- 155 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:39:07 ]
- >>152
折角mapなのに全検索は勿体無くねぇ?
- 156 名前:149 mailto:sage [2008/01/13(日) 21:47:11 ]
- >>153
lower_bound()とupper_bound() にするのは速度的な問題でしょうか? しかし、キーを二回余分に渡すのもちょっと面倒ですね。 >>152 一旦キーでマッチしたものを、すべてシーケンスコンテナに入れて そこからさらに絞り込むっていう方法も考えていたんですが 今、私が書いているコードで使う要素数が多くても3個ほどなので あまり変わらないような気がしました。 要素が多いとまた変わってくるかもしれません。
- 157 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:04:28 ]
- >>153 >>155
確かに。multimapだった。 equal_range()でイテレータの組を取ってもいいか。 >>156 全部の要素をlinerで舐めるのは非効率だわ。 上の人たちが言ってるやり方が効率が良い。
- 158 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:06:48 ]
- upper_boundとlower_boundは大小の順にソートシーケンスに
適用するアルゴリズムだ。 std::mapはデフォルトでキー順に既に要素を挿入した時点で ソートされているのでまさに効率の良い方法。 Cで言うとbinary_search()な。
- 159 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:13:59 ]
- >>156
KeyとValueの両方の条件で削除要素を決定するなら 汎用性を考えた場合、Linerになるけど全部舐める しかないかもな。まあ、今の場合は削除対象を絞る 条件がKeyが3に固定されてるからいいけど。
- 160 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 23:31:50 ]
- >>156
149の通りの条件なら、Key == 3 の範囲をequal_rangeで得て、 その範囲に対して Value == 'c' を消してまわるのが速そう。平均的には、ね。 総要素数に対してequal_rangeの範囲が無視できるだけ小さいならおk。 実際に行いたい条件が149と違う場合は話が違ってくる。 Keyが単一とは限らないとか。...って、>>159に書いてあるか。
- 161 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:47:18 ]
- そういえばmultimapってどういう用途に使ってますか?
mapは連想配列の様に便利に使ってますが multimapという道具の使い方がいまいち思い浮かばない…。
- 162 名前:デフォルトの名無しさん [2008/01/14(月) 11:02:35 ]
- 得点が0〜100点で、名前を要素とする
同一得点は存在するからマルチ
- 163 名前:161 mailto:sage [2008/01/14(月) 11:07:45 ]
- >>162
なる。 70点取った人を羅列その他できますね。 サンクスです
- 164 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:23:23 ]
- >>161
辞書
- 165 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:25:39 ]
- STL限定なら別だけど辞書ならbimapの方がよくね?
- 166 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:48:17 ]
- 用途の話しだ
- 167 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:18:36 ]
- 「ようとのはなししだ」ですか?
- 168 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:19:33 ]
- >>167
辞書引け
- 169 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:19:40 ]
- とりあえず度数分布表以外にも例挙げてよよよ
- 170 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:21:26 ]
- >>168
辞書ならbimapの方がよくね?
- 171 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:22:53 ]
- 用途の話だ。
- 172 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:46:33 ]
- >>162
この例で、0点のダメ男君が何人いるかと、 その名前の列記とかってどうやって出力するの? mismatch()とか使うのかな。 foreachループでフラグ立てながらは勘弁
- 173 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:59:41 ]
- 俺ならequal_range
- 174 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 02:04:41 ]
- 割と典型的なequal_rangeの出番だと思う。
人数だけが知りたい場合は、countがいいかな。もちろんメンバ関数のほうね。
- 175 名前:172 mailto:sage [2008/01/15(火) 11:07:03 ]
- >>173-174
ありがとうございます。 equal_range、及びcount便利ですね。 説明読んでて、「該当者のいる得点一覧」(無重複の使用キー一覧)の方法に ぶちあたった。 もうちょい調べてみます。
- 176 名前:デフォルトの名無しさん [2008/01/17(木) 18:02:56 ]
- 配列の先頭を指すポインタと末尾を指すポインタのペアを返す
テンプレート関数を作成したいのですが、うまくいきません。 以下のコードはVC++6.0でもBCC5.5でもコンパイルエラーです。 正しい方法を教えてください。 #include <utility> #include <algorithm> template <class T, int n> std::pair<T*, T*> iseq(T a[n]) { return std::pair<T*, T*>(a, a + n); } int main() { int x[] = {6, 1, 3, 4, 2}; std::sort(iseq(x).first, iseq(x).second); return 0; }
- 177 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:07:47 ]
- VC6やBCC5といった糞コンパイラを捨てる
- 178 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:09:45 ]
- >>176
#include <utility> #include <algorithm> #include <iostream> #include <iterator> template <class T, int n> std::pair<T*, T*> iseq(T (&a)[n]) { return std::pair<T*, T*>(a, a + n); } int main() { int x[] = {6, 1, 3, 4, 2}; std::sort(iseq(x).first, iseq(x).second); std::copy(x, x + sizeof(x) / sizeof(x[0]), std::ostream_iterator<int>(std::cout, " ")); }
- 179 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:13:54 ]
- ああそうだわ、>>178はBCCじゃコンパイルできないよ。
VC6はどうか知らんが、VC7.1やVC8、VC9なら行けると思う。 gcc3.4.5でもOKだった。
- 180 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:16:29 ]
- >>179
bcc5.5.1と5.8.2でコンパイルできたよ
- 181 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:17:41 ]
- BCC5.9.2でも行けるね。
- 182 名前:176 mailto:sage [2008/01/17(木) 18:25:31 ]
- >>178
ありがとうございます。>>180さんがおっしゃるとおり bcc5.5.1ではOKでしたが、VC++6.0ではダメでした。
- 183 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:52:19 ]
- boost::begin()やboost::end()の実装を参考にしてみれば?
- 184 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:40:09 ]
- >>178がコンパイルできないのは、どこが原因?
- 185 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:44:49 ]
- >>184
iseq(T (&a)[n]) この部分が解析できないフロントエンドを持つコンパイラ。
- 186 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:06:23 ]
- VC6 とか無理だった記憶がある。
- 187 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:47:01 ]
- >>185
T (&a)[n] の仮引数aの型が解らんてこと? aが配列参照と理解できないってことかな
- 188 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:59:29 ]
- 配列参照に対応していないだけ。
- 189 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:54:28 ]
- BCCは template で T (&a)[n]とやってあると大丈夫みたいだが
int (&a)[n] のように型を決め打ちされてしまうとコンパイルが 通らなかったような。 templateの特殊化には対応してんのかな。どっかいろんな細かい 部分が標準と挙動が異なるのでSTLportから見捨てられかけたり boostへの対応度が低かったりする。
- 190 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 08:37:20 ]
- コンパイラ実装者にとってパターンマッチほど面倒くさいものはない。
- 191 名前:デフォルトの名無しさん [2008/01/18(金) 09:13:16 ]
- VC6 はもうそろそろ寝かせてやって,
VC9 使おうよ… Express Edition もあるんだから.
- 192 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 09:14:58 ]
- VC9も色々バグがあってヤヴァイみたいだけどな
STLをやboostを使うならVC8がgccとかも含めて一番安定して使えるかも
- 193 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 09:35:46 ]
- 質問です。
equal_range()でvectorの特定の値を検索したいのですが vectorの要素はマルチキーなのです。 typedef struct{ int x; int y; }DATA; このような感じの場合。 どのようにすればいいのでしょうか? やはり自分で作らないと出来ないのでしょうか? 宜しくお願いします。
- 194 名前:193 mailto:sage [2008/01/18(金) 10:30:48 ]
- 事故解決しました。
第4引数があるんですね・・・。 でもこの引数、ググっても、日本語のページは、4件しかヒットしないや・・・orz
- 195 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:31:00 ]
- boost使うなら現状VC8の方がいいだろうが
それ以外バグが問題でVC8使った方がいい ってあり得るの?
- 196 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 13:53:30 ]
- >>194
STLはそういう使い方しないもん。 structじゃなくて、classにしとけよ。 operator定義できないから、多分比較関数定義出来ないぞ。 検索する値はint型、比較する対象はvector<DATA>のDATAっしょ? 比較関数は定義できても、呼び出し側の引数は等価な型を与えるから無理。 先に比較用のoperator書かないと。
- 197 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:07:07 ]
- structかclassかの問題だったのか
- 198 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:21:50 ]
- >>196
別にstructでもoperator()は定義できるでしょ。 今はそれはどうでもよくて、strict weak odering条件を満たす bool operator(const Data&, const Data&); を定義して、operator(const Data&, const Data&)で vector<Data>をソートしておいて、eqaul_rangeに同じ Comparisonであるoperator(const Data&, const Data&)を 渡せばいいんでないのか? ということを>>193は言ってると思ったんだが。
- 199 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:30:05 ]
- × bool operator(const Data&, const Data&);
○ bool operator<(const Data&, const Data&);
- 200 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:46:28 ]
- >>198
operator<を定義してたらComparison(>>194の言う第4引数)渡さなくていいんじゃ?
- 201 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 15:12:36 ]
- あれ?structでoperator定義出来たんだ。
|

|