提升multi_index_container,范围变异算法和constness
我正在使用boost multi_index_container,该范围由quare_range查询,并使用范围返回函数的结果:: join and boost :: any_range Any_range参考参数定义为const引用类型 - 必须是const,因为Multi_index_container性质,而不确定引用.示例: typedef boost::any_range TestRange; 现在我需要的是使用boost :: sort,sortion等的突变范围算法,显然由于范围内的元素构成而无法在范围内运行. 除了将元素复制到新容器外,是否有解决方法? 编辑1: 结构和麦克风示例: struct TestData { TestDa
0 2024-01-23
编程技术问答社区
在C++中为哈希图拥有一个复合键
我有一个具有 的数据结构 , , and 由于可以重复书名或作者,因此我想构建一个复合键. (假设我不能制作额外的独特键,例如ID) 由于数据非常大,我正在使用GCC Unordered_map为了速度, 我像这样构建了我的结构: typedef pair keys_t typedef unordered_map map_t; 总体上一切正常, 但是,当我想引用一个特定键时,问题就会发生. 例如,假设我想在名为"数学"的书中找到最有评分的书,或者我想找到"托尔斯泰"书的平均速度. 在这种情况下,这将变得非常麻烦,因为我不仅可以指关键对之一. 我碰巧找到了boost::multi_index,但是我很难理解这些文档. 有人对此有一些想法或指南吗? 解决多个索引的解决方案,多_index的简洁示例,任何其他方法等.任何帮助将不胜感激
2 2023-11-09
编程技术问答社区
Boost多索引容器与基于std::unordered_map(map的映射)的多级映射容器的比较
我最近发现了BOOST :: MULTI_INDEX_CONTAINER,我对他的性能感到好奇,与我自己的基于多级映射的类似容器的实现相比,我的性能很好奇,并定义为: typedef int Data; typedef uint64_t MainKey; typedef uint64_t SecondaryKey; typedef std::unordered_map SecondaryMap; typedef std::unordered_map PrimaryMap; 关键排序并不重要.快速查找很重要,为此,我正在使用: // find primaryKey=10 and secondaryKey=30 PrimaryMap m; .... auto i1 = m.find( 10); if ( i1 != m.end()) { auto& se
2 2023-11-09
编程技术问答社区
std::unordered_map-如何在任何时候 "跟踪 "最大/最小键
我有std::unordered_map. 我不想使用其他结构,例如树或其他任何引起延迟要求. 但是在任何时候,我都需要知道当前的最大密钥和最小密钥. 我怎样才能做到这一点?分布不均匀,而是经常去除和插入最大和最小值.因此,我需要更聪明的东西,而不是"删除当前最大/分钟时只扫描整个地图最大/分钟". 我不想使用任何其他结构.我想使用std::unordered_map! upd 根据答案创建了这样的结构: struct OrderBookItem { int64_t price; int32_t lots; }; typedef multi_index_container , ordered_un
0 2023-11-09
编程技术问答社区
C++: 在使用Boost MultiIndex时确定一个指针类型的类别
这个问题的答案具有一般应用,但是我将以以下示例激励它: 我有以下模板类: template class Collection { public: struct id{}; struct name{}; // A collection parameterized by type V that is indexed by a string 'name' // and a integer 'id' // The type V must implement 'get_id()' and a 'get_name()' functions typedef multi_index_container , const_mem_fun
2 2023-10-30
编程技术问答社区
提升多索引容器的模板参数
我需要创建一个包含多索引容器作为存储的通用类.当我编译时,它会在下面定义nth Index视图的位置会产生错误. 错误:非转录" nth_index"用作模板 /** * connection manager */ template class conn_mgr: boost::noncopyable { public: /** * connection ptr */ typedef boost::shared_ptr conn_ptr_t; /** * connection table type * It's a multi index container */ typedef boost::multi_index::multi_index_container
6 2023-10-15
编程技术问答社区
Boost Multi_index_container和慢速操作员++
It is follow-up question for 这个麦克风问题.在参考包装器的矢量添加项目时,我在++操作员中花费了大约80%的时间,无论我选择的迭代方法是什么. 该查询的工作原理如下 VersionView getVersionData(int subdeliveryGroupId, int retargetingId, const std::wstring &flightName) const { VersionView versions; for (auto i = 0; i ().equal_range(boost::make_tuple(subdeliveryGroupId + i, retargetingId
4 2023-09-30
编程技术问答社区
对于拥有多索引类的列表来说,使用值为std::shared_ptr的map是一个好的设计选择吗?
问题很简单: 我们的课程具有成员A,B,C,D ... 我们希望能够快速搜索(一个成员的键为一个值),并通过为A或B或C的当前值提供新值的更新类列表. 我考虑过一堆 std::map>. 1)这是个好主意吗? 2)Boost多索引在各个方面都优于此手工制作的解决方案吗? ps sql出于简单/perf的原因是不可能的. 解决方案 提升多索引可能具有明显的缺点,即它将尝试在每个集合的每个突变之后保持所有索引最新的最新. 如果您有许多单独写入的数据负载阶段,这可能是巨大的惩罚. 增强多索引的使用模式可能与项目(成员)的编码样式(和口味...)不符.这应该是一个较小的劣势,但我想我会提到它 如ildjarn所述,BOOST MI不支持移动语义 否则,我会在大多数情况下考虑提升多索引上级,因为您不太可能达到收到的测试量. 其他解决方案 您要考
4 2023-09-29
编程技术问答社区
如何为Boost::Nested_Container实现Boost::Serialize?
(另一个问题). boost ::序列化通常会在Oarchive上提供例外,抱怨重新创建特定对象会导致重复的对象.一些档案可以成功保存和重新加载,但许多档案会导致上述错误.我尚未确定发生错误的确切条件,但是我证明,没有用于填充嵌套的_Container的内容,而平面对象列表包含重复的对象ID.我正在使用文本存档,而不是二进制.这是我修改了nested_container的代码以及另一个单独的平面对象列表以进行boost :: serialize: 进行修改的代码. struct obj { int id; const obj * parent = nullptr; obj() :id(-1) { } obj(int object) :id(object) { } int getObjId() const { return id;
6 2023-08-29
编程技术问答社区
Boost::Multi-index用于嵌套列表
如何在列表列表中实现boost ::多索引 我有一个分层树,如下: typedef std::list objList // the object list typedef std::list topLevelList // the list of top-level object lists struct obj { int Id; // globally unique Id std::string objType; std::string objAttributes; .... topLevelList childObjectlist; } 在顶级,我有一个std :: struct obj的列表 然后,这些顶级OBJ中的每一个都可以具有许多子对象, 该对象的Toplevellist列表中包含.这可以继续,因为嵌套名单中的一个孩子也有自己的孩子. 有些物体只能是孩子,而另一些物体则是容器
10 2023-04-21
编程技术问答社区
如何实现boost multi_index
我有一些困难,了解如何实现Boost.MultiIndex.可以说我有以下内容: typedef multi_index_container >, ordered_unique > > > employee_set; 我想我有一个数组,Employee[]实际上存储employee对象,而两个地图 map map 命名和年龄为钥匙.每个地图具有employee*值,该值指向数组中存储的对象.这还可以吗? 解决方案 给出了实现是基于与指针相互关联的节点,就像您最喜欢的std::
4 2023-04-05
编程技术问答社区
从升力多指数数组中移动元素
假设我有可移动的对象,而不是可复制的对象,并且具有随机索引的增强多指数数组.我需要将我的对象移出阵列前方,但是找不到任何方法,这会给我提供rvalue/lvalue参考,文档.我只能看到front(),它给了我持续的参考和pop_front()删除元素,但不会返回任何内容.因此,有没有办法将元素从Boost Multi-Index中移出? 解决方案 添加到 @sehe的答案中,以下显示了如何修改代码,以防您的可移动类型不默认构造: 编辑:更改了代码以正确处理*extracted的破坏. 编辑:添加了std::unique_ptr的替代方案. 编辑: sehe .. #include #include #include #include struct moveon
62 2023-04-01
编程技术问答社区
当擦除或修改不同索引的键值时,boost::multi_index的迭代器是否会失效?
在测试中似乎工作正常,但是我找不到文档中预期行为的任何提及. 本质上,如果我的multi_index_container分别使用键A和B分别使用2个Ordered_non_unique索引,如果我迭代a并修改b值(可能导致重新订购)的范围(无效)? 解决方案 迭代器永远不会无效,只要元素未删除即可.请注意,无效与重新定位不同(由重新订购引起). 迭代器依赖于密钥A的索引A将不会无效,也不会重新定位(即,该索引保留其命令)对其他键B上的更改,只要不删除受影响的元素(如果索引,这种情况就会发生取决于键B是唯一). 如果您想在A-Index修改B键上安全范围,即使在擦除情况下,您也可以按照以下的例证进行操作: #include #include #include #includ
14 2023-03-30
编程技术问答社区
boost::multi_index_container, 对容器内std::set的操作
我已经在容器类上创建了一个boost :: multi_index_container(containerSet),并由std::string和std::set索引containerSet.是否可以获取容器?此外,是否可以获取所有容器,哪个容器在其集合中至少存储一个值? ? #include #include #include #include #include #include #include using boost::multi_index_container; using nam
24 2023-03-02
编程技术问答社区
提升多索引将索引转换为标签,并在索引上循环。
i有一个模板类(CRMultiIndex),该类别接收模板参数A Boost Multi Index(GlobalHash)的定义.我与C ++ 14 一起使用 我需要一种将索引转换为标签(n_to_tag)的方法?并循环crmultiindex ctor或init函数中的索引? 我的最初目的是循环循环索引,并在init上使用TypeId(t).name()生成标签名称字符串.因此,我可以根据标签名称显示统计信息 我有模板类 template class CrMultiIndex { std::vector m_StatsByIndex; public: MultiIndexType *m_pMultiIndex=NULL; CrMultiIndex() { m_pMultiIndex
38 2023-03-02
编程技术问答社区