Boost MultiIndex - 对象或指针(以及如何使用它们?)?

Posted

技术标签:

【中文标题】Boost MultiIndex - 对象或指针(以及如何使用它们?)?【英文标题】:Boost MultiIndex - objects or pointers (and how to use them?)? 【发布时间】:2010-04-15 19:02:41 【问题描述】:

我正在编写一个基于代理的模拟,并认为 Boost 的 MultiIndex 可能是我的代理最有效的容器。我不是专业的程序员,而且我的背景很参差不齐。我有两个问题:

    让容器自己包含代理(Host 类)更好,还是让容器容纳Host * 更有效?主机有时会从内存中删除(这是我的计划,无论如何……需要阅读newdelete)。主机的私有变量偶尔会更新,我希望通过 MultiIndex 中的modify 函数来完成。模拟中不会有其他 Host 副本,即不会在任何其他容器中使用它们。 如果我使用指向主机的指针,如何正确设置密钥提取?我下面的代码无法编译。
// main.cpp - ATTEMPTED POINTER VERSION
...
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/tokenizer.hpp>

typedef multi_index_container<
  Host *,
  indexed_by< 
    // hash by Host::id
    hashed_unique< BOOST_MULTI_INDEX_MEM_FUN(Host,int,Host::getID) > // arg errors here
    > // end indexed_by
  > HostContainer;

...
int main() 

   ...
   HostContainer testHosts;
   Host * newHostPtr;
   newHostPtr = new Host( t, DOB, idCtr, 0, currentEvents );
   testHosts.insert( newHostPtr );
   ... 

我在 Boost 文档中找不到精确类似的示例,而且我对 C++ 语法的了解仍然很薄弱。当我用类对象本身替换所有指针引用时,代码似乎确实有效。


据我所知,Boost documentation(参见底部的汇总表)暗示我应该能够将成员函数与指针元素一起使用。

【问题讨论】:

【参考方案1】:

如果Host 包含大量数据,您可以使用shared_ptr 来避免复制。您可以在其中使用带有 shared_ptr 的 MultiIndex:

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

using namespace boost::multi_index;

struct Host

   int get_id() const  return id; 
 private:
   int id;
   // more members here
;

typedef multi_index_container<
  boost::shared_ptr<Host>,    // use pointer instead of real Host
  indexed_by< 
    // hash using function Host::get_id
    hashed_unique< const_mem_fun<Host, int, &Host::get_id> >
    > // end indexed_by
  > HostContainer;

那么你可以如下使用它:

int main()

   HostContainer testHosts;
   Host * newHostPtr;
   newHostPtr = new Host;
   testHosts.insert( boost::shared_ptr<Host>(newHostPtr) );

  return 0;

【讨论】:

感谢您的帮助。我将研究共享指针——如果我不使用 ptr,这是否意味着每个对象都存储在内存中的两个位置(一次在创建时,然后再次在容器中)?另外,Host 是一个类,Host::id 是一个私有成员变量。如果 HostContainer 充满 Host * 或 shared_ptr...,我正在尝试弄清楚如何使用成员函数 Host::getID() 作为我的密钥提取器 在我的回答中添加了成员​​函数get_id。如果您不使用shared_ptr,则意味着每个Host 都将被复制到MultiIndex 容器中,并且副本将一直存在,直到您将其从那里删除。 我在之前的同一行遇到编译错误:“main.cpp:57: error: could not convert template argument '&Host::getID' to 'int (Host::* )()const'"。 你的函数不是const。您应该将其定义为 int Host::getID( void ) const return id; ,因为 multi_index_container 中的元素被视为常量。 要从迭代器中获取 id,您可以编写 (*it)-&gt;getID()it-&gt;get()-&gt;getID()

以上是关于Boost MultiIndex - 对象或指针(以及如何使用它们?)?的主要内容,如果未能解决你的问题,请参考以下文章

Boost.MultiIndex 模板替换失败?

指针的Boost序列化保存指针的十六进制值而不是对象的内容

Boost Multiindex:示例在 cpp 文件中编译,但不在标头中

boost--function

smart_ptr之shared_ptr

boost::bind 返回一个函数对象,它是需要指针的函数的参数