- 1 名前:デフォルトの名無しさん mailto:sage [2014/12/18(木) 13:46:24.42 ID:Mboq20NA]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part114 peace.2ch.net/test/read.cgi/tech/1408743258/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]2ch.net peace.2ch.net/test/read.cgi/tech/1417179292/ 次期規格C++1yはこちら C++14/C++1z 20 peace.2ch.net/test/read.cgi/tech/1410382924/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
- 355 名前:デフォルトの名無しさん mailto:sage [2015/01/04(日) 18:54:03.72 ID:ZWEZbTe4]
- 2つの集合a,bがあったときにその和集合,差集合をつくってaにいれたいです
a = a - b; a = a + b; みたいな感じにしたいのですが 今だと,下みたいにやってます もっと簡潔にかけませんか? set<int> a = { 1, 2, 3, 4 }; set<int> b = { 3, 4, 5, 6 }; set<int> c; set_difference(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.end())); a.clear(); copy(c.begin(), c.end(), inserter(a, a.end())); for (int i : a) { cout << i << " "; } cout << endl;
- 356 名前:デフォルトの名無しさん mailto:sage [2015/01/04(日) 19:10:46.28 ID:FLoKSBkb]
- >>355
boost::range版ならset_difference(a, b, inserter(c, c.end()));と書ける。 あとはa.swap(c);としたほうが簡単速い。 これ以上短くしたいなら関数にまとめる。
- 357 名前:デフォルトの名無しさん mailto:sage [2015/01/04(日) 19:16:50.27 ID:L6fkGxZk]
- 集合クラス作って演算子オーバーロードしとくかなあ
ググりゃ転がってそう
- 358 名前:デフォルトの名無しさん mailto:sage [2015/01/04(日) 19:37:56.46 ID:VX3mvVTy]
- >>355
試してないけど、↓これじゃダメなの? for(int i; b) { a.erase(i); } // a = a - b a.insert(b.begin(), b.end()); // a = a + b
- 359 名前:デフォルトの名無しさん mailto:sage [2015/01/04(日) 20:06:04.40 ID:LHqo9g84]
- まんま std::set_difference と std::set_union なのでは…
これより簡潔にしたいなら自分でラッパーなり書くしかないと思うお…
- 360 名前:デフォルトの名無しさん mailto:sage [2015/01/04(日) 20:30:47.31 ID:LHqo9g84]
- ヒマだったから書いてみたお
コンテナを受け取るラッパー関数書くだけで意外とすっきりしたお https://ideone.com/YikJPu
- 361 名前:355 mailto:sage [2015/01/04(日) 20:58:50.58 ID:ZWEZbTe4]
- みなさんありがとうございます
競プロで書いているときにbeginとかendを書くのが大変だったので なにか楽な方法を探してました a.swap(c)とかa.insert(b.begin(), b.end())は全然思いつかなかったので参考になりました.使わせてもらいます とりあえず他のintersectionとかはラッパ書いて処理してみます ありがとうございました
- 362 名前:デフォルトの名無しさん mailto:sage [2015/01/04(日) 22:30:48.07 ID:kU4tFNpU]
- >>349
なるほど、確認した。半年前の話か‥
- 363 名前:デフォルトの名無しさん mailto:sage [2015/01/05(月) 22:33:25.30 ID:f33/Q9TD]
- 前スレにあったプライベート変数にアスセスするコードをようやく理解した。
ほぼコピペだが記念に貼っとく ideone.com/GVpGlQ
- 364 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 01:36:28.96 ID:vDyOmCN+]
- 何でそんな事したいのか分からないけど、初期化時にポインタ受け取れば済むような
- 365 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 14:33:17.28 ID:SaW7LnEX]
- C++のstd::listってガベージコレクションはしていないんですよね?
フラグメンテーション起こさないようにするためにはどっか別に固定領域を確保してそっからデータ持ってくるようにしないと ダメでしょうか?
- 366 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 14:40:08.17 ID:C2mmH5Le]
- はい
- 367 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 18:04:47.26 ID:22vat4md]
- いえ、してますよ
マークアンドスイープ方式のガベージコレクションをしてないだけで
- 368 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 18:34:47.65 ID:0kbQZJFE]
- フラグメンテーションとGC直接関係ないし
- 369 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 19:11:45.23 ID:XxVOSZ3z]
- コンパクション(メモリのデフラグ)も行うコピーGCのことを言っているんじゃないかと
しかし、時代はGCじゃないよねぇ。時代は参照カウントだよ。 C++11でも、shared_ptrが追加されたし。 シンタックスがどんどん汚くなっていくのはC++の悲しいところだな。
- 370 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 19:24:03.99 ID:Ey7XFEeM]
- >時代は参照カウントだよ
へー、そいつは凄いな
- 371 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 22:59:26.61 ID:Y26C2d1q]
- そういや、shared_ptr ってオブジェクトレベルでマルチスレッド対応してるんかな?
- 372 名前:デフォルトの名無しさん [2015/01/06(火) 23:01:02.23 ID:a1JT3SDg]
- >>242
遅くなりましたがあなたのお陰で解決しました。ありがとうございます!
- 373 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 23:11:59.71 ID:Z2lMmRuz]
- >>371
標準ライブラリは「constメンバ関数=マルチスレッド対応」で統一していたはずだが
- 374 名前:デフォルトの名無しさん mailto:sage [2015/01/06(火) 23:53:02.99 ID:kiKfNKwr]
- >>369
シンタックスそんなに汚いかなあ、C++11
- 375 名前:デフォルトの名無しさん mailto:sage [2015/01/07(水) 00:17:19.84 ID:Y9yyLQNc]
- >>373
じゃあ、コピーコンストラクタや代入演算子はダメなのかねー。 スマポの魅力半減。 昔、参照カウンタ方式のstringでエライ痛い目みたからなー…
- 376 名前:デフォルトの名無しさん mailto:sage [2015/01/07(水) 00:20:45.94 ID:A8Vu2ukb]
- >>375
代入はだめだろ けどコピーコンストラクタは、仮にもコンストラクタだし、オブジェクトを構築してるスレッド以外から手の触れようがないと思うが
- 377 名前:デフォルトの名無しさん mailto:sage [2015/01/07(水) 00:23:58.83 ID:J9Js0gVS]
- shared_ptr自体はマルチスレッドに対応してるだろ
マルチスレッドでどれだけ参照を増やそうが減らそうがdeleteされなかったり2重deleteしたりしない
- 378 名前:デフォルトの名無しさん mailto:sage [2015/01/07(水) 07:10:13.57 ID:Re9e7Fnn]
- それは君の環境で「自分で同期したら問題なく動いた」ってだけでは?
- 379 名前:デフォルトの名無しさん mailto:sage [2015/01/07(水) 09:05:13.51 ID:DkZd7T6D]
- 異なるshared_ptrに対する操作ならデータ競合を起こさないことが保証されてるよ
ttp://faithandbrave.hateblo.jp/entry/20130328/1364463249 同じshared_ptrに対する更新などの操作をデータ競合を発生させずに行うためのものも提供されてる ttp://en.cppreference.com/w/cpp/memory/shared_ptr/atomic
- 380 名前:デフォルトの名無しさん mailto:sage [2015/01/07(水) 09:13:45.90 ID:v+HQiVT1]
- WinのInterlickedExchage関数, QtのQAtomicIntみたいなもんか
型がTなのでより進化してるけど
- 381 名前:デフォルトの名無しさん mailto:sage [2015/01/07(水) 13:47:42.98 ID:rq5tkzs4]
- >>379
それと所有するオブジェクト自体を複数のスレッドから操作する場合はmutexが必要になると。
|

|