gpt4 book ai didi

c++ - 如何获得 boost::multi_index 容器的交集

转载 作者:行者123 更新时间:2023-11-30 02:35:07 28 4
gpt4 key购买 nike

我想以最快的方式获取类型为 ordered_non_unique 的 4 个索引的交集。这样的 multi_index 交集是否比嵌套 4 次的 std::map 快?是否有可能使用类似 std::map().emplace() 的东西。

这是我的代码。

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>

using boost::multi_index_container;
using namespace boost::multi_index;

struct Kpt {
Kpt(float _x0, float _x1, float _y0, float _y1)
: x0_(_x0),x1_(_x1),y0_(_y0),y1_(_y1) {
}
friend std::ostream& operator<<(std::ostream & _os, Kpt const & _kpt) {
_os
<< "\nx0 " << _kpt.x0_ << ","
<< " y0 " << _kpt.y0_ << ","
<< " x1 " << _kpt.x1_ << ","
<< " y1 " << _kpt.y1_ << std::endl
;
return _os;
}
float x0_;
float x1_;
float y0_;
float y1_;
};

struct x0_{};
struct x1_{};
struct y0_{};
struct y1_{};

typedef multi_index_container <
Kpt
, indexed_by <
ordered_non_unique <
tag<x0_>,BOOST_MULTI_INDEX_MEMBER(Kpt,float,x0_)
>
, ordered_non_unique <
tag<x1_>,BOOST_MULTI_INDEX_MEMBER(Kpt,float,x1_)
>
, ordered_non_unique <
tag<y0_>,BOOST_MULTI_INDEX_MEMBER(Kpt,float,y0_)
>
, ordered_non_unique <
tag<y1_>,BOOST_MULTI_INDEX_MEMBER(Kpt,float,y1_)
>
>
> Kpts;

int main() {
Kpts kpts;
for (int i=0; i<1000000; ++i) {
if (i%10000==0) std::cout << "." << std::flush;
kpts.insert(Kpt(0.1,0.1,0.1,0.1));
}
}

最佳答案

好的,现在我明白你想搜索区域 [x0,x0+d]×[x1,x1+d]×[y0,y0+d]×[y1 中的 4 维点,y1+d],对吧?

好吧,我不敢说 Boost.MultiIndex 不是正确的工具,因为获取索引 #0、#1、#2、#3 范围的交集只能通过扫描其中一个来完成范围(比如 #0)并手动验证遍历点的剩余坐标 (x1, y0, y1) 是否位于感兴趣的区域内(std::set_intersection 不甚至适用于此,因为它要求比较的范围按相同的标准排序,而我们的索引不是这种情况)。

boost::geometry::index::rtree 或一些类似的空间数据结构,正如您所指出的,可能更适合这项工作。

关于c++ - 如何获得 boost::multi_index 容器的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958780/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com