Post-Kona paper 解説 P0083R1: Splicing Maps and Sets (Rev.3) 稲葉 一浩

Slides:



Advertisements
Similar presentations
Tt_clown ( 津川 知朗) 俺 Tokenizer を作る ~ Boost.Tokenizer のカスタマイズ~ 2009/12/121 Boost 勉強会.
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
Generic programming と STL
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
稲葉 一浩 SC22/C++WG May 2015 Review for N4399: “Working Draft, Technical Specification for C++ Extensions for Concurrency” 稲葉 一浩
第11回 整列 ~ シェルソート,クイックソート ~
Ex7. Search for Vacuum Problem
クラスその2∽(アドバンス)∽ 福岡工業大学  梶原 大慈       .
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Ex8. Search for Vacuum Problem(2)
データ構造とアルゴリズム 第10回 mallocとfree
基礎プログラミング 第13回(2007年5月28日) 「関数」の補足説明 Report-Fの解説.
今、此処にあるC++ ~テンプレートとSTL~.
今、此処にあるC++ ~テンプレートとSTL~.
情報工学概論 (アルゴリズムとデータ構造)
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
情報処理Ⅱ 2005年12月9日(金).
条件式 (Conditional Expressions)
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
INSERT(x,p,L)の例 (一部) 磯 直行 2009年5月5日
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
最短経路.
第11回 整列 ~ シェルソート,クイックソート ~
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
二分探索木によるサーチ.
C++0x コンセプト 高橋晶(アキラ) ブログ:「Faith and Brave – C++で遊ぼう」
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
シューティングゲーム.
プログラミング 4 記憶の割り付け.
二分探索木における要素削除 データ構造とプログラミング(10)
第9回 優先度つき待ち行列,ヒープ,二分探索木
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造1 2005年7月5日
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
型の compatibility とポインタ演算
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
15.cons と種々のデータ構造.
データ構造とアルゴリズム 第11回 リスト構造(1)
プログラミング 3 2 次元配列.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
Boostのスマートなポインタを使ってみる
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」
ゲームのタスクシステム 導入編 レベル2くまー By keychan.
発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19
How To WPF アプリケーション Part4 By 中博俊.
データ構造とアルゴリズム論 第9章 連結リスト
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
演算子のオーバーロード.
PROGRAMMING IN HASKELL
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
値渡しと参照渡しについて.
俺 Tokenizer を作る ~Boost.Tokenizer のカスタマイズ~
Presentation transcript:

稲葉 一浩 kinaba@google.com Dec 4, 2015 Post-Kona paper 解説 P0083R1: Splicing Maps and Sets (Rev.3) http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0083r1.pdf 稲葉 一浩 kinaba@google.com Dec 4, 2015

std::list には、ある list から別の list に要素を “移す” 機能がある list<int> x = {0,1,2,3,4}; auto xs = std::find(x.begin(), x.end(), 1); auto xe = std::find(x.begin(), x.end(), 4); list<int> y = {10,20,30}; auto yi = std::find(y.begin(), y.end(), 20); y.splice(yi, x, xs, xe); // x == {0, 4} // y == {10, 1,2,3, 20, 30} map や set にも欲しい! というのが今回の提案

ただし std::list::splice は (連結リストのポインタの付け替えとして実装できるので) O(1) 時間 set, map, unordered_set, ... では無理  コンテナ内部表現のためのメモリの解放や   再割り当ては行わずに、移動できるようにする   “ちょっとだけ”効率化するための提案

C++14 での要素の移動 std::set<int> x = {1,2,3}; std::set<int> y; int elem = *x.begin(); x.erase(x.begin()); y.insert(elem); ここで x 内部で 探索木の ノード用メモリ解放 ここで y 内部で 探索木の ノード用メモリ確保 提案 std::set<int> x = {1,2,3}; std::set<int> y; y.insert(x.extract(x.begin())); 内部ノードの所有権を move で x から y へ 移動。

ポイント set<Key, Comp, Allocator> Comp が例外を投げないなら insert/erase も投げない set<MoveOnlyType> から値を取り出せるようになる。 (以前も値を入れることは .emplace でできた)

論点になるかもしれないポイント extract() された set::node_type オブジェクトは、元のコンテナの寿命を超えて生存する extract(const key_type& k) で存在しないキーを指定してもよい (“ノード無し”を表す値を返す)  この値の insert は常に失敗 取り出した(移動途中の)値のkeyやvalueは変更可能

template<class Key, class Comp, class Alloc> class set { typedef 未規定 node_type; typedef 未規定 insert_return_type; node_type extract(iterator); node_type extract(const key_type&); insert_return_type insert(node_type&&); insert_return_type insert(iterator, node_type&&); template<class C2> void merge(set<Key,C2,Alloc>& source); template<class C2> void merge(set<Key,C2,Alloc>&& source); };

class node_type { value_type& value(); key_type& key(); mapped_type& mapped(); // mapの場合 explicit operator bool(); bool empty(); }; class insert_return_type { bool inserted; iterator position; node_type node; //挿入できなかった場合ここに戻る };

気になった点 unordered_ コンテナへの移動が nothrow というのは難しいのではないか (他は特になし)