分区标准::2D点的矢量
Partition std::vector of 2D points
假设我有一个std::vector<Point>
,其中Point
是struct Point { double x; double y;}
我想将这样的向量划分为组(桶),其中同一桶中的所有点彼此之间具有相同的欧几里得范数(例如dist(PointA,PointB)==X,其中X是常数)。我决定使用std::map
与自定义排序运算符执行这样的任务
struct ClosePoints
{
bool operator()(Point const& A, Point const& B) const
{
bool same = dist(A,B) < x;
//If not close enough use lexical sort
return same ? false : std::tie(A.x, A.y) < std::tie(B.x,);
}
}
分区代码:
std::map<Point, std::list<Point>, ClosePoints> map;
for(const auto& p : pointsVector)
map[p].push_back(p);
经过一些测试和打印桶,我注意到一些遵守给定欧几里得范数极限X
的点在不同的桶中结束。我不明白为什么会这样?
问题是您定义的比较运算符不提供等价关系。例如,你可以有一个接近a和C的点B,但点a和C可能相距很远。因此,如果你将B与A和C进行比较,你会将它们与B放在同一个篮子里。然而,如果你先比较A和C,结果将是不可预测的。
相关文章:
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 如何使用用户输入在C++中正确填充2D数组
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 如何在C++中检查2D数组中负值的输入验证
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 如何声明 2D 标准::数组
- 如何查找 2d 标准::数组中的列数
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 在 2D 标准::矢量<矢量中查找唯一值的有效方法<double>>
- 标准::表示 2D 数据的矢量中的内存泄漏
- 当标准测试失败时,用于查找点是否在2D多边形内的替代测试
- 分区标准::2D点的矢量