我正在寻找virtual void DoSomething() override = 0;
函数的替代版本,但是std::set_intersection
向量。
我尝试比较两个不同大小的std::vector<cv::Point>
个向量。这两个包含坐标列表。交叉方法的主要任务现在应该是检测公共对并通过std::vector<cv::Point>
std::vector<cv::Point>
我搜索了push_back()
任何想法如何解决这个问题?
答案 0 :(得分:2)
正如@BoBTFish和@NaCl已经提到的,你需要使用自定义比较器,并在排序向量上应用set_intersection
。
由于您需要调用比较器三次,因此使用函数而不是lambda表达式很有用。
#include <opencv2/opencv.hpp>
#include <vector>
#include <algorithm>
using namespace std;
using namespace cv;
// Custom less comparator
bool lessPoints(const Point& lhs, const Point& rhs) {
return (lhs.x < rhs.x) || ((lhs.x == rhs.x) && (lhs.y < rhs.y));
}
vector<Point> intersection(vector<Point> v1, vector<Point> v2)
{
vector<Point> v3;
// Sort vectors
sort(v1.begin(), v1.end(), lessPoints);
sort(v2.begin(), v2.end(), lessPoints);
// Intersect
set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v3), lessPoints);
return v3;
}
int main()
{
// Your vectors
vector<Point> v1{ Point(2,3), Point(1,2), Point(5,5), Point(3,4) };
vector<Point> v2{ Point(2,1), Point(1,2), Point(3,4), Point(6,7), Point(0,3) };
// Find intersections
vector<Point> v3 = intersection(v1, v2);
// Print out vector content
std::copy(v3.begin(), v3.end(), std::ostream_iterator<Point>(std::cout, " "));
return 0;
}