提升 multi_index ordered_unique 中值

发布于 2024-09-02 01:40:11 字数 150 浏览 5 评论 0原文

我想快速从具有有序唯一索引的 boost multi_index 容器中检索中值,但是索引迭代器不是随机访问(我不明白为什么它们不能,尽管这与 std::set 一致...)。

除了增加迭代器 container.size() / 2 次之外,还有更快/更简洁的方法吗?

I would like to quickly retrieve the median value from a boost multi_index container with an ordered_unique index, however the index iterators aren't random access (I don't understand why they can't be, though this is consistent with std::set...).

Is there a faster/neater way to do this other than incrementing an iterator container.size() / 2 times?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱*していゐ 2024-09-09 01:40:11

Boost.MultiIndex 提供随机访问索引,但这些索引不直接处理任何顺序。但是,您可以在插入新元素后使用 sort 成员函数对这些索引进行排序,这样您就可以有效地获得中位数。

看来您应该向 Boost.MultiIndex 发出请求,以便可以直接使用订单完成插入,因为这应该更有效。

Boost.MultiIndex provide random access indexes, but these index don't take care directly of any order. You can however sort these index, using the sort member function, after inserting a new element, so you will be able to get the median efficiently.

It seems you should make a request to Boost.MultiIndex so the insertion can be done using an order directly, as this should be much more efficient.

随遇而安 2024-09-09 01:40:11

我在不同的环境中遇到了同样的问题。似乎STL 和Boost 没有提供可以随机访问的有序容器来利用排序(例如用于比较)。

我的(不太漂亮)解决方案是使用一个执行输入并在集合中“过滤”它的类。输入操作完成后,它只是将集合中的所有迭代器复制到向量中,并将其用于随机访问。

此解决方案仅适用于非常有限的上下文:您在容器上执行一次输入。如果您再次更改添加到容器中,则所有迭代器都必须再次复制。使用起来确实很笨拙,但确实有效。

I ran into the same problem in a different context. It seems that the STL and Boost don't provide an ordered container that has random access to make use of the ordering (e.g. for comparing).

My (not so pretty) solution was to use a Class that performed the input and "filtered" it in a set. After the input operation was finished it just copied all iterators of the set to a vector and used this for random access.

This solution only works in a very limited context: You perform input on the container once. If you change add to the container again all iterators would have to be copied again. It really was very clumsy to use but worked.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文