以cv::Point为键的std::map
std::map with cv::Point as key
我需要创建std::map<cv::Point, double>
。cv::Point
是OpenCV库中的一种点类型。它有像x
和y
这样的字段。
cv::Point
当然没有<
运算符。您知道如何定义它以最佳方式访问std::map
中的元素吗?
换句话说。例如,我有20000分。我需要快速访问每一个点。
例如:
std::map<cv::Point, double> myMap;
Point p(10, 234);
int value = 777;
myMap[p] = value; // I need this operation quite fast so I decided to use std::map
但是cv::Point没有<
运算符。我可以准备<
操作符(例如,它只比较x坐标):
bool operator<(const cv::Point a, const cv::Point b)
{
return a.x < a.x;
}
但我想这不是一个好的操作员。许多点具有相同的x值。
在这种情况下,如何准备高效的操作员?
根据本文档,cv::Point
表示一个二维数据点。为此,您可以通过标准字典排序来定义运算符<
:
bool operator<(cv::Point const& a, cv::Point const& b)
{
return (a.x < b.x) || (a.x == b.x && a.y < b.y);
}
编辑:当您考虑使用unordered_map
时:尽管它在这里可能更合适,但它的实现有点复杂,因为您必须组合x
和y
这两个哈希值。为此,您可以使用boost::hash_combine
或自己找出一些合理的方法,但您会发现它变得更加复杂。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++如何创建 std::map
- 从其他容器中移动构造"std::map"
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- C++ 使用枚举类对象分配 std::map 值
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- std::map:当元素不可默认构造时创建/替换元素
- Arduino编译器和STL:使用std::vector和std::map