C++ 如何从boost::multi_index_容器中检索元素

C++ 如何从boost::multi_index_容器中检索元素,c++,boost,C++,Boost,我正在尝试使用唯一的数字id索引从boost::multi_index_容器检索一个值。我以前从未使用过boost::multi_index_container,因此我在理解它们的工作原理时遇到了一些困难。它们的工作方式有点像数据库,我只想通过指定id来检索一个项目。任何帮助都将不胜感激 这是数据类型: typedef boost::多索引容器< //多索引容器包含指向子网的指针。 子网6PTR, //以下内容包含所有索引。 boost::多索引::按索引索引< //首先是允许访问的随机访问索引

我正在尝试使用唯一的数字id索引从
boost::multi_index_容器
检索一个值。我以前从未使用过
boost::multi_index_container
,因此我在理解它们的工作原理时遇到了一些困难。它们的工作方式有点像数据库,我只想通过指定id来检索一个项目。任何帮助都将不胜感激

这是数据类型:

typedef boost::多索引容器<
//多索引容器包含指向子网的指针。
子网6PTR,
//以下内容包含所有索引。
boost::多索引::按索引索引<
//首先是允许访问的随机访问索引
//对象,就像我们处理向量一样。
boost::多索引::随机访问<
boost::multi_index::tag
>,
//第二个索引允许使用子网标识符进行搜索。
boost::多索引::有序唯一<
boost::multi_index::tag,
boost::多索引::const\u mem\u fun
>,
//第三个索引允许使用toText函数的输出进行搜索。
boost::多索引::有序唯一<
boost::multi_index::tag,
boost::多索引::const\u mem\u fun
>
>
>子网6收集;
Subnet6Collection
对象是在dhcpv6服务器(KEA)加载其配置文件时创建的。此文件包含数据类型中每个子网的可选数字id值,
SubnetID


我想通过指定
SubnetID
来检索
子网6ptr
,是的,多索引可能很难使用。正如我在中所写,“Boost.Multi-index提供了一个极其可定制的界面,但代价是提供了一个极其复杂的界面。”

基本上,当您想要访问容器的内容时,您可以通过它的一个索引进行访问。因此,您首先要获取对要使用的索引的引用(在您的例子中是on taged
subnetsubnetdindextag
),然后将该索引视为一个容器。使用哪个容器取决于索引的类型。对于一个oredered唯一索引(如您的情况),这有点像
std::map
(但迭代器只指向值),或者像
std::set
,它有一个只比较ID的透明比较器

下面是它在代码中的外观:

Subnet6Collection coll = something();
SubnetID idToLookFor = something2();

auto& indexById = coll.index<SubnetSubnetIdIndexTag>();
auto it = index.find(idToLookFor);
if (it != index.end()) {
  Subnet6Ptr p = *it;
} else {
  // No such ID found
}
Subnet6Collection coll=something();
子网idToLookFor=something2();
auto&indexbyd=coll.index();
auto it=index.find(idToLookFor);
if(it!=index.end()){
子网6ptr p=*it;
}否则{
//没有找到这样的ID
}
谢谢您的回答

我尝试了以下方法(SubnetID只是uint32,所以我使用10进行测试):

SubnetID=10;
子网6收集coll;
auto&indexbyd=coll.index();
autoit=index.find(id);
if(it!=index.end()){
子网6ptr p=*it;
}否则{
//没有找到这样的ID
}
但它没有编译:

Opt18_lease_select.cc:38:24:错误:无效使用'struct boost::multi_index::multi_index_container,boost::multi_index::indexed_by>,boost::multi_index::ordered_unique,boost::multi_index::ordered_unique,boost::multi_index::const_mem _fun,&isc::dhcp::Subnet::toText>>>::index'

auto&indexbyd=coll.index();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Opt18_lease_select.cc:39:17:错误:重载了没有上下文类型信息的函数

autoit=index.find(id);
^~~~
Opt18_lease_select.cc:40:17:错误:重载了没有上下文类型信息的函数

if(it!=index.end()){
^~~

似乎index()find(),end()不能这样使用,或者我只是缺少一些头文件?

这是一个数据库习惯用法。为什么不使用(许多非常好的方法之一)C++ API是SQLite?或者至少描述基于关系数据库的解决方案。假设键值存储是出于某种原因而不充分的……作为最小的说明,C++是你允许的吗?使用。@ChefGladiator他们试图使用某个库提供的
Subnet6Collection
类型的对象,而不是重新编写库以使用SQL代替
coll.index
/
coll.get
,s/
index
/
indexById
,请阅读文档