提升multi_index_container破坏的索引

时间:2014-01-09 11:25:41

标签: c++ boost boost-multi-index

我有一个multi_index容器。 Chan :: Ptr是对象的shared_pointer。 容器有两个带对象函数的索引。

typedef multi_index_container<
    Chan::Ptr,
        indexed_by<
        ordered_unique<const_mem_fun<Chan,string,&Chan::Channel> >,         
        ordered_non_unique<const_mem_fun<Chan,string,&Chan::KulsoSzam> > >
    > ChanPtrLista;

直到我只将push_back对象放入容器中,所有在容器中搜索都成功。

当我修改对象中的值时(例如:Chan :: Channel changes),索引将被破坏。使用索引列出容器,返回错误的订单。但是查找功能不再起作用了。

如何重新索引容器? (“rearragne”方法对索引不执行任何操作。)

1 个答案:

答案 0 :(得分:3)

在对Boost多索引中的项进行更改时,应使用索引对象公开的modify方法。 modify方法具有以下签名:

bool modify(iterator position, Modifier mod);

其中:

  • position是指向要更新的项目的迭代器
  • mod是一个functor,它接受​​一个参数(您想要更改的对象)。

如果修改成功,则返回true;如果修改失败,则返回false

运行修改功能时,仿函数会更新您要更改的项目,然后索引全部更新。

示例:

class ChangeChannel
{
public:
  ChangeSomething(const std::string& newValue):m_newValue(newValue)
  {
  }

  void operator()(Chan &chan)
  {
    chan.Channel = m_newValue;
  }

private:
  std::string m_newValue;
};


typedef ChanPtrLista::index<0>::type ChannelIndex;
ChannelIndex& channelIndex = multiIndex.get<0>();

ChannelIndex::iterator it = channelIndex.find("Old Channel Value");

// Set the new channel value!
channelIndex.modify(it, ChangeChannel("New Channel Value"));

您可以找到更多信息here