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 回答