multi_index_container - キーエクストラクタ

multi_index_container のインデックスのタイプが ordered_unique、または ordered_non_unique の場合には、さらにそれらのテンプレート引数にキーエクストラクタが必要となる。キーエクストラクタには大きく、identity, member, const_mem_fun, mem_fun の4種類がある。
identity
テンプレート引数の型そのものをキーとする。
multi_index_container<
  T,
  indexed_by<
    ordered_unique<identity<T> >
  >
>
は std::set<T> と等価になる。
面白いのは コンテナの要素の型がポインタのように振舞う型の場合は、キー抽出時に参照を自動的に剥がしてくれることだ。
multi_index_container<
  T*,
  indexed_by<
    ordered_unique<identity<T> >
  >
>
であれば T*の参照を剥がして、(*t) の値をキーとして抽出してくれる。
T*でなくてもポインタのように振舞う型(shared_ptrなど)ならOKだ。
さらにT**などのようにポインタのポインタでも (*(*t)) をキーとして抽出してくれる。うーん賢い。

member
コンテナの要素のメンバ変数をキーとする。クラスTのメンバT::aをキーとする場合は以下のように記述する。
member<T, T::aの型, &T::a>
なお、コンパイラによってはこの記法ではコンパイルできない場合があるようで、ポータビリティのために以下のマクロが用意されている。
BOOST_MULTI_INDEX_MEMBER(T, T::aの型, a)
ってことでこちらを使ったほうが良いだろう。
また、identityと同様にコンテナで管理するのがポインタのように振舞うオブジェクトならば、勝手に参照を剥がしてくれる。

const_mem_fun
コンテナの要素のメンバ関数の返り値をキーとする。クラスTのメンバ関数T::fをキーとする場合は以下のように記述する。
const_mem_fun<T, T::fの返り値の型, &T::f>
memberと同様ポータビリティのために以下のマクロを使うことが推奨される。
BOOST_MULTI_INDEX_CONST_MEM_FUN(T, T::fの返り値の型, f)

これまた identity と同様にコンテナで管理するのがポインタのように振舞うオブジェクトならば、勝手に参照を剥がしてくれる。

mem_fun
const_mem_funとほぼ同じ。BOOST_MULTI_INDEX_MEM_FUN マクロで指定できる。

composite_key
複数のmember, const_mem_fun, mem_fun を組み合わせて1つのキーとすることができる。例えば、座標値x, yをキーにstd::mapに要素を格納する場合に
std::map<std::pair<double, double>, A> 
なんて感じで 2つの値をpairにして1つのキーにしたりしたが、これと同じことが composite_keyによって実現できる。 クラスT の2つのメンバ変数 T::x, T::y のペアをキーとする場合は
composite_key<T,
  member<T, double, &T::x>,
  member<T, double, &T::y>
>
となる。 このとき、キーの大小関係は std::pairのように、まずはxで比較し、等しければyで比較することで決定される。
3つ以上を組み合わせたい場合はテンプレート引数を増やすだけでOKだ。
composite_key<
  member<T, double, &T::x>,
  member<T, double, &T::y>,
  member<T, double, &T::z>
>


外部キー
例えば クラスTのメンバ変数 T::a の値をキーとするのではなく、さらにaのメンバ関数f()を適用した T::a.f() をキーにしたい場合などもある。a.f() を呼び出すTのメンバ関数を新たに追加すれば、mem_funによって実現できるが、外部キーによる実現も可能だ。
これは 適切に operator()()や、result_type という型を定義したキークラスを作成して、mem_fun などの代わりに用いればよい。
ドキュメントのExample.6を参照。

<< multi_index_container - インデックスの型 Site Top Game Programming Gems 3 >>

Comments

ガガミラノ 腕時計
2016/08/22 06:25 AM
日本最大級の腕時計 ブランド 激安通販。腕時計 メンズ、腕時計 レディース、腕時計 ブランド、腕時計 人気、腕時計 子供、セイコー腕時計、カシオ腕時計ほか豊富な品ぞろえ。最短で当日出荷!直輸入だから格安!全国送料無料でお届け!
ダニエルウェリントン
2016/08/22 07:48 AM
Dw-japan.com公式通販サイト。ダニエルウェリントン,Daniel Wellington,ダニエルウェリントン 腕時計,ダニエルウェリントン ベルト ダニエルウェリントン 新作 腕時計 Daniel Wellington シルバー 38mm Dapper Bristol ダッパー ブリストル 1123DW ブランド: カテゴリー:ダニエルウェリントン 38mm
shnlhdzq
2016/08/22 07:52 AM
Pasture | multi_index_container - キーエクストラクタ
[url=http://www.gky9vich546r365lj601s9gfzh52433ns.org/]ushnlhdzq[/url]
shnlhdzq http://www.gky9vich546r365lj601s9gfzh52433ns.org/
<a href="http://www.gky9vich546r365lj601s9gfzh52433ns.org/">ashnlhdzq</a>
シティサイクル
2016/08/22 08:43 AM
本最大級の自転車通販サイト。シティサイクル,シティサイクル 通販,シティサイクル 24インチ,シティサイクル 26インチ,シティサイクル 27インチ,シティサイクル おしゃれ,人気,安い,高級,シティサイクル自転車!あなたの欲しい自転車がきっと見つかる!安心のアフター修理保証付き。組立後即日発送だから、届いた日からすぐ乗れる!
Paul Smith 長財布
2016/08/22 08:50 AM
新品 Paul Smith ポールスミス 長財布 レディース 財布 メンズ 財布激安通販。 カテゴリー:ポールスミス 長財布 価格:10800
ティソ腕時計
2016/08/22 10:04 AM
ティソ(TISSOT)時計の海外通販サイト!2016 ティソ タッチコレクション tissot touch collection 腕時計 メンズ TISSOT T-TOUCH EXPERT Titanium T013.420.47.201.00 価格:40500
バーバリー Tシャツ 2016
2016/08/22 03:20 PM
BURBERRY バーバリー Tシャツ メンズ 人気 グリーン ブランド:バーバリー Tシャツ カテゴリー:バーバリー Tシャツ メンズ 価格:11200
LOUIS VUITTON メンズ ベルト
2016/08/22 03:52 PM
ベルト人気ブランド大特集。ブランドベルトはもちろん、ベルトjapan限定販売人気 ルイヴィトン LOUIS VUITTON メンズ ベルト 茶色を販売。常時3,000点以上の在庫。在庫限り有お見逃しなく!最短翌日発送 カテゴリー:ルイヴィトン メンズ ベルト 価格:31290
フランクリンマーシャル パーカーセット
2016/08/22 03:57 PM
FRANKLIN&MARSHALL|フランクリンマーシャルの通販サイトです。FRANKLIN&MARSHALL(フランクリンマーシャル)のフランクリンマーシャル Tシャツ、パーカー、ポロシャツを豊富に取り揃えています。 カテゴリー:フランクリンマーシャル パーカーセット メンズ
ナイキ リュック キッズ
2016/08/22 04:36 PM
ナイキ リュック|リュック?バックパックの通販サイト。人気のアディダス リュック,ナイキ リュック,バンズ リュック,ノースフェイス リュック,フェールラーベン リュックのページです。100%品質保証できます。2016人気高質な製品を驚きの低価格で提供して、送料無料でお届けします。毎日新作アイテム入荷中! カテゴリー:ナイキ リュック 価格:7100
アディダス リュック ニコラ
2016/08/22 05:08 PM
2016 アディダス リュック adidas リュック 三つ葉 ブラック カテゴリー:アディダス リュック 価格:3780
エンポリオ アルマーニ ベルト
2016/08/22 06:12 PM
新作 GIORGIO ARMANI アルマーニ ベルト メンズ レザー ベルト L008 カテゴリー:アルマーニ ベルト 価格:22800
アルマーニ時計メンズ
2016/08/22 06:46 PM
当店は海外ブランド時計の専門店。人気のガガミラノ 腕時計、アルマーニ 時計、バーバリー 時計のページです。100%品質保証できます。直輸入だから格安!全国送料無料でお届け!
ヴィヴィアン ハンドバッグ
2016/08/22 08:53 PM
「www.vivienne-bag.com」ヴィヴィアンウエストウッド 専門店 新入荷 Vivienne Westwood ヴィヴィアン ウエストウッド ハンドバッグ ピンク ブランド:Vivienne Westwood ヴィヴィアン ウエストウッド カテゴリー:ヴィヴィアン ハンドバッグ 価格:26300
アディダス 時計 スポーツ
2016/08/22 10:25 PM
アディダスの通販専門店。アディダス スニーカー、アディダス リュック、アディダス Tシャツ、アディダス 時計、アディダス キャップ、アディダス iphone ケース、アディダス オリジナルスの総合通販。どこよりも品揃えも豊富です! カテゴリー:アディダス 時計
バッグ,財布&小物専門店,
2019/08/25 11:08 AM
東京第七家信用ブランドコピー時計の実体の店
ブランドコピーバッグの誠実と信用の店、
24時間以内に出荷し、3〜4日に到着して、
当社の販売のさまざまな国際ブランド、
ルイヴィトンバッグ、エルメスコピー、
ロレックスコピー、オメガ コピー、
シャネル時計コピー、ブランドコピーバッグ、
当社は誠心誠意あなたのためにサービス、
バッグ,財布&小物専門店, http://www.cocoejp.com/ProductList1.aspx?TypeId=741724312753501
ブランドバッグスーパーコピー
2019/10/24 03:46 PM
ブランドコピーN
ブランドスーパーコピー通販専門店!人気N品激安!
2019年新品種類がそろっています。
品質がよい、価格が低い、実物写真!
弊店のスーパーコピー時計は品質2年無料保証になります。
日本全国送料で数量無料です。
スーパーコピーブランド財布
2019/11/02 02:58 PM
凄く丁寧に対応下さいましてありがとうございます。連絡も早くて、決済方法の変更にも快く応じて下さり・・・尚且つ、発送も早くして頂いたので誕生日に間に合いました。本当にありがとうございました
★ブルガリ ブルガリ★ブルガリ ブルガリ リング★AN855854★750(K18PG)×ダイヤモンド★サイズ54★
ずっとずっと・・・憧れ続けていたブルガリリング。ゼロワンのタイプにしようか・・・とか、何年迷い続けていたのか忘れてしまいましたが・・・10年以上は迷い続けていたと思います。
その中でも、日本限定クリスマス限定のこちらは欲しくても手に入れれなかったので諦めていたのですが、私の誕生日にと主人が購入してくれる事に。
新品とは思えない綺麗なお品で・・・箱もつぶれも汚れもなく、本当に大満足です。
スーパーコピーブランド財布 https://www.b2kopi.com/brand/list.aspx?page=7&id=133