问题标签 [boost-multi-index]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何使用 boost 多索引容器创建树
我正在尝试创建一棵树。我的第一个要求是树级别中的对象按其插入顺序排序。
作为第一次尝试,我使用了 stl 矢量类:
这个小程序编译成功并按预期执行。
更进一步,我想添加通过名称访问树级别对象的功能,因此我尝试使用 boost 多索引,因此我修改了 Node 类,如下所示:
但它根本不编译。使用 gnu g++ 4.6.1 版,第一个错误是
有人可以帮我解决这种相互依赖吗?
非常感谢你。
最好的祝福
感谢詹姆斯霍普金,我的程序部分工作:
现在我必须在替换/修改方法中工作,以便将元素添加到多索引迭代器检索到的对象中。
非常感谢你。
c++ - 如何释放 boost::multi_index::multi_index_container 使用的内存?
如何释放“person_map_t multi_indexed_persons_map”使用的内存?我在谷歌上找不到关于它的东西。
这是我的测试代码:
如何测试:
- 启动二进制文件。
- 等到它完成插入。
- 使用 . 检查内存消耗
ps u -C <binname>
。 - cin somthing,至少一个标志。
- 使用 再次检查内存消耗
ps u -C <binname>
。
现在应该释放一些内存,对吧?
编辑:
valgrind 输出:
boost - 从 Boost MultiIndex 中删除
我有一个 boost 多索引结构,它将 boost::shared_ptr 保存到类 A 的实例中。当我使用其中一个索引的“查找”函数时,我得到一个迭代器“it”,我可以从中取回实际指针通过A* a = it->get();
。a
知道erase
多索引结构的函数采用迭代器,而不是指针或 boost::shared_ptr,如何从多索引中删除?事情是在我想要擦除对象的程序点上,我不再有我的初始迭代器,只有实际的指针。
谢谢
c++ - 为什么 boost-multi-index 会返回错误的迭代器?
Boost 文档说 iterator_to 会返回一个有效的迭代器,但下面的代码表明发生了其他事情。
Boost.MultiIndex 的所有索引都提供了一个名为 iterator_to 的成员函数,它返回一个指向容器给定元素的迭代器
http://www.boost.org/doc/libs/1_51_0/libs/multi_index/doc/tutorial/indices.html#iterator_to
c++ - 使用 boost::tuple 引用作为 ordered_unique 索引的键来增加多索引插入错误
我把它归结为我能想到的最简单的示例代码。
我有一个成员索引的 boost multi:
这样做似乎使多索引认为每个项目都是相等的(大小永远不会> 1)
我正在存储一个具有 2 个成员的结构,我希望多索引的唯一键是这两个成员。我认为制作一个引用元组可以相当简单地完成此任务。它的行为不像我预期的那样。当元组中的项目被引用时,似乎每个新项目都与现有项目冲突。可能还值得注意的是,简单地远离引用将使代码的行为符合我的预期,但这并不能帮助我理解为什么引用案例不起作用。
如示例中所述,如果我使元组保持值并且不引用所有内容,则可以按预期工作。
我花了很多时间研究各种可能性(悬空引用、比较 boost:tuples 在一个没有多索引的小程序中的引用等)
这是我的编译命令: g++ -O0 -ggdb -Wall -Werror test.cc -lboost_system -lpthread
运行程序给出:
itr = 1 10 itr = 1 10
表明即使我尝试插入 1,20 和 3,10,multi 似乎也认为它们等于 1,10。
我很困惑。任何和所有的帮助表示赞赏。
c++ - 复制构造函数调用 boost::multi_index_container 中的自定义排序谓词
我boost::multi_index_container
用来为一组对象提供多个视图和排序顺序。最近,我想使用自定义排序谓词对容器进行排序,该谓词(本质上)预先计算所有对象的属性值,然后使用这些值对它们进行排序(参见下面的示例代码)。
operator()
容器已正确排序,但我注意到使用此谓词进行排序比使用仅访问我的对象的内部属性的谓词进行排序需要更长的时间。
进一步的调查表明,我的谓词的(隐式定义的)复制构造函数经常被调用。由于谓词的每个副本都包含完整属性映射的副本,因此需要很长时间。
我已经通过向我的对象添加内部属性来解决这个问题,但我仍然不相信这是最好的做法。所以,我想知道:
- 为什么复制构造函数经常被调用?
- 我是否正确定义了我的谓词?谓词不应该包含这么多内部数据吗?
- 有什么比定义另一个内部对象属性更好的解决方案?
这是我的代码的相关部分。我没有详细描述这个Object
类,因为它的属性不会导致问题。
c++ - boost multi_index 修改成员和保留序列
我正在使用 boost::multi_index 容器。基本上它由一些数据加上如果数据集信息完整的信息组成(当将项目添加到容器中时,信息尚未完成)。容器已排序,因为我必须知道订单项已添加到容器中。
我想获得一个迭代器对,迭代迭代完成设置为 1 的序列项。
第一个 std::copy 带有迭代完成标志的索引,但顺序不正确(意思是我希望订单作为推入容器的项目)
第二个 std::copy 给出了正确的顺序,但也会打印迭代完成 == 0 的项目。
有什么提示吗?
boost-multi-index - 对大数据进行聚合:C++、boost 还是 RDBMS?
我想在 C++ 中读取一个包含 600M 记录的文件,并根据给定的字段标准(例如empl.loacation='FL' and empl.dept=3
)执行聚合。
使用 C++ 是一个可行的选择吗?我可以走数据库路线,但想知道,鉴于我的要求是只读的 - 聚合,我可以只使用 C++ 吗?
我看到了boost 多索引库。它比普通的 C++ 或 DB 更适合这种操作吗?
c++ - 传递模板参数时 MSVC++ 编译器错误 C2923
我有multi_index_container
一个struct Person
:
和 boost 的包装类iterator_adaptor
:
最后,我为 编写了一个包装类PersonMultiSet
,以便向该类的用户公开一个干净的接口并避免 boostmulti_index_container
有点繁琐的接口:
在 VS2010 下编译此代码会在函数 foo 的声明中产生以下错误:
似乎编译器不允许IteratorAdaptor<PersonMultiSet::index<T>::type::iterator
在第一次使用时确定类型(我什至在尝试实例化PersonContainer
或调用 foo 之前就收到了这个错误)。我究竟做错了什么?
boost - 使用 Composite_key 从 multi_index_container 中擦除每个键的元素
我有multi_index_container
一个索引是composite_key
. 但我找不到一种方法来通过它的键擦除一个元素。请看下面:
erase(key)
适用于非复合索引。但我找不到复合键的正确语法。