- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑以下代码
struct VersionData
{
VersionData();
VersionData(VersionData&& rhs);
int m_versionId;
int m_weight;
int m_pId;
bool m_hdi;
};
struct VersionId{};
typedef boost::multi_index_container<
VersionData,
bmi::indexed_by<
bmi::ordered_non_unique<
bmi::tag<VersionId>,
bmi::member<VersionData, int, &VersionData::m_versionId>
>
>
> VersionDataContainer;
struct VersionsData
{
VersionsData();
VersionsData(VersionsData&& rhs);
int m_sdGroupId;
int m_retId;
VersionDataContainer m_versionData;
};
struct mvKey{};
typedef boost::multi_index_container<
VersionsData,
bmi::indexed_by<
bmi::ordered_unique<
bmi::tag<mvKey>,
bmi::composite_key<
VersionsData,
bmi::member<VersionsData,int, &VersionsData::m_subdeliveryGroupId>,
bmi::member<VersionsData,int, &VersionsData::m_retargetingId>
>
>
>
> mvDataContainer;
mvDataContainer m_data;
目的是使用 mvDataContainer 中的复合键进行查找,但在某些情况下,我需要在所有 VersionsData 中查找 VersionData。像 m_data.get<mvKey>.equal_range(make_tuple(ignore, ignore, ignore)).get<VersionId>.equal_range(123456);
第一个问题,是否可以实现?
其次,这是使用嵌套 multi_index_containers 的正确方法吗?任何性能影响/ yield ?
最佳答案
除了建议为整个表使用单个容器的其他答案之外,这是基于 Boost Intrusive multiset
的想法。
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/composite_key.hpp>
// for intrusive multiset
#include <boost/intrusive/set.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>
namespace bmi = boost::multi_index;
namespace bi = boost::intrusive;
struct VersionData : bi::set_base_hook<bi::link_mode<bi::auto_unlink> > {
VersionData(int versionId, int weight=0, int pId=0, bool hdi=false) :
m_versionId(versionId), m_weight(weight), m_pId(pId), m_hdi(hdi) { }
int m_versionId;
int m_weight;
int m_pId;
bool m_hdi;
friend std::ostream& operator<<(std::ostream& os, VersionData const& vd) {
return os << "{ " << vd.m_versionId << " " << vd.m_weight << " " << vd.m_pId << " " << vd.m_hdi << " }";
}
struct ById {
bool operator()(VersionData const& a, VersionData const& b) const { return a.m_versionId < b.m_versionId; }
};
};
typedef bi::multiset<VersionData, bi::constant_time_size<false>, bi::compare<VersionData::ById> > VersionIndex;
typedef boost::multi_index_container<
VersionData,
bmi::indexed_by<
bmi::ordered_non_unique<
bmi::tag<struct VersionId>,
bmi::member<VersionData, int, &VersionData::m_versionId>
>
>
> VersionDataContainer;
struct VersionsData
{
int m_subdeliveryGroupId;
int m_retargetingId;
VersionDataContainer m_versionData;
};
typedef boost::multi_index_container<
VersionsData,
bmi::indexed_by<
bmi::ordered_unique<
bmi::tag<struct mvKey>,
bmi::composite_key<
VersionsData,
bmi::member<VersionsData,int, &VersionsData::m_subdeliveryGroupId>,
bmi::member<VersionsData,int, &VersionsData::m_retargetingId>
>
>
>
> mvDataContainer;
void insert(
mvDataContainer& into, VersionIndex& global_version_index,
int subdeliveryGroupId, int retargetingId, int
versionId, int weight, int pId, bool hdi)
{
auto& mainIdx = into.get<mvKey>();
auto insertion = mainIdx.insert(VersionsData { subdeliveryGroupId, retargetingId, VersionDataContainer {} });
mainIdx.modify(insertion.first, [&](VersionsData& record) {
auto insertion = record.m_versionData.insert(VersionData { versionId, weight, pId, hdi });
global_version_index.insert(const_cast<VersionData&>(*insertion.first));
});
}
int main() {
VersionIndex global_version_index;
mvDataContainer table;
insert(table, global_version_index, 21, 10, 1, 100, 123, false);
insert(table, global_version_index, 9, 27, 2, 90, 123, false);
insert(table, global_version_index, 12, 25, 3, 110, 123, true);
insert(table, global_version_index, 10, 33, /*version 8:*/ 8, 80, 123, false);
insert(table, global_version_index, 4, 38, 5, 101, 124, false);
insert(table, global_version_index, 33, 7, 6, 91, 124, false);
insert(table, global_version_index, 34, 27, 7, 111, 124, true);
insert(table, global_version_index, 9, 11, /*version 8:*/ 8, 81, 124, false);
insert(table, global_version_index, 0, 12, 9, 99, 125, false);
insert(table, global_version_index, 35, 39, /*version 8:*/ 8, 89, 125, false);
insert(table, global_version_index, 15, 15, 11, 109, 125, true);
insert(table, global_version_index, 25, 32, /*version 8:*/ 8, 79, 125, false);
// debug table output
assert(table.size()==12);
// so now you can do:
std::cout << "---\nQuerying for version id 8:\n";
for (auto& record : boost::make_iterator_range(global_version_index.equal_range(8)))
std::cout << record << "\n";
table.erase(table.find(boost::make_tuple(10,33))); // auto unlinks from global_version_index
std::cout << "---\nQuerying for version id 8:\n";
for (auto& record : boost::make_iterator_range(global_version_index.equal_range(8)))
std::cout << record << "\n";
}
打印:
---
Querying for version id 8:
{ 8 80 123 0 }
{ 8 81 124 0 }
{ 8 89 125 0 }
{ 8 79 125 0 }
---
Querying for version id 8:
{ 8 81 124 0 }
{ 8 89 125 0 }
{ 8 79 125 0 }
关于c++ - 查找嵌套的 boost multi_index_container,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825538/
我有一个 boost multi_index_container 声明如下,它由 hash_unique id(unsigned long) 和 hash_non_unique 事务 id(long)
我有以下定义: typedef boost::multi_index_container, boost::multi_index::indexed_by > > > Request
我的代码(不是我的代码)中有一个使用 boost multi_index_container 的类 template class foo_map { typedef MapEntry_T Map
我有一个 multi_index_container索引为 composite_key . 但我找不到一种方法来通过它的键删除一个元素。 请看下面: #include #include #incl
我正在使用 boost:multi_index_container。以下是代码 #include #include #include "boost/multi_index/global_fun.h
我正在寻找一种用于快速迭代时间的连续数据结构,并结合通过 key 进行快速随机访问。此外,我需要有效地从索引中取回 key 。目前,我使用标准库中不同集合的组合。 std::vector values
我有一个 multi_index_container 和索引 - ordered_unique。我知道我的值会以某种方式排序(默认情况下使用 less )。我想要的是找到值的精确排序索引,而不使用一些
考虑下表: id F1 F2 0 0 10 1 5 20 2 20 30 3 8 13 4 13 17 5 50 65 6 15 26 7 8 15 搜
我有一个颜色类。 我想创建一个 boost::multi_index_container使用颜色 ID 和颜色位置(在渐变类中)作为键。 为了保持代码更具可读性,我将 boost 实现封装在我的 In
我正在玩一些 boost 容器,但最近遇到了障碍,因为我似乎无法正确定义 multi_index_container。我正在按照我离线抓取的示例进行操作,但它仍然给我错误消息: struct boos
我有一个 boost::multi_index_container 由 hashed_unique 和 sequenced 索引。我怎样才能从这个容器的最后一个元素中获取第二个元素? struct M
尝试按照有关此用法的 boost 文档进行操作,但遇到了障碍。 基于 CentOS 7、g++ 4.8.5-28 构建。语言标准:C++03 工作样本:https://godbolt.org/z/KP
我正在尝试编写计算密集型程序。我需要 char* 作为 multi_index_container 的 composite_key_compare 的比较字段。但是,它似乎不起作用。代码如下: str
我在服务器中使用 MIC 作为我的 LRU 缓存,它已经取代了列表/映射 LRU,因为我怀疑这是导致一些无法解释的内存占用的原因。内存泄漏是不可能的,至少没有工具发现任何泄漏以及代码检查。自从我开始使
考虑以下代码 struct VersionData { VersionData(); VersionData(VersionData&& rhs); int m_ver
我有一个结构来存储有关人员的信息和 multi_index_contaider 来存储此类对象。多索引用于按不同条件进行搜索。 我已将几个人添加到容器中,并希望按姓氏查找人员。如果我使用整个姓氏,效果
我一直在尝试使用 boost::multi_index_container 来解决我遇到的问题。但是,multi_index_container 甚至无法编译声明。 MPL 函数中的错误很深,我不知道
我可以依赖在内存映射文件中分配的 boost multi_index_container 吗?这种“数据库”可以在具有相同字节顺序的计算机之间移植吗? 最佳答案 不,这不安全。内存映射文件中第一个字节
因此,我正在尝试使用 multi_index_container 并且遇到了一个相当奇怪的编译器错误,首先这是演示我的问题的最简单的示例(我可能遗漏了一些非常简单的东西) ... #include
我有一个 multi_index 容器。 Chan::Ptr 是对象的共享指针。容器有两个带有对象函数的索引。 typedef multi_index_container >,
我是一名优秀的程序员,十分优秀!