0

multi_index_containerであるインデックスを持つがありcomposite_keyます。しかし、キーで要素を消去する方法が見つかりません。下記を参照してください:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/composite_key.hpp>

using namespace boost::multi_index;

struct Point
{
    int x, y;
};

void func()
{
  multi_index_container<Point,indexed_by<
    hashed_unique<
      composite_key<Point,
                    member<Point,int,&Point::x>,
                    member<Point,int,&Point::y> >
      > > > points;

  points.find( boost::make_tuple( 3, 3 ) );    // <- works
  points.erase( boost::make_tuple( 3, 3 ) );   // <- failes to compile
}

erase(key)複合ではないインデックスに対して機能します。しかし、複合キーの正しい構文が見つかりません。

4

2 に答える 2

3

eraseタプルとの相互運用を可能にするタイプのオーバーロードはありません(技術的には、これは互換性のある拡張機能の概念に関連しています)。ただし、もう少しコードを追加しても同じ効果が得られます。

auto p=points.equal_range(boost::make_tuple(3,3));
points.erase(p.first,p.second);
于 2012-09-25T10:48:44.360 に答える
0

リクエストに応じて、前の回答に追加します。次のようにすることができます。

Point p={3,3};
points.erase(points.key_extractor()(p));

これに関する唯一の問題は、スケーリングしないことです (Point構築に費用がかかる場合)。

于 2012-09-25T17:39:28.010 に答える