sort(points.begin(), points.end());什么意思
时间: 2024-05-27 21:08:37 浏览: 107
这行代码是用来对一个 vector 容器中存储的元素进行排序的。其中,points 是存储了一些点的 vector 容器,每个点包含两个坐标值。调用 sort() 函数时,传入了 points.begin() 和 points.end() 两个迭代器,表示要对整个容器中的元素进行排序。sort() 函数默认按照元素的小于号运算符进行排序,因此可以看做是按照点的 x 坐标从小到大进行排序,如果 x 坐标相同,则按照 y 坐标从小到大进行排序。
相关问题
请分析一下这段代码:class Point { public: int x, y, z; }; vector<Point> v; // insert some points into v ... auto xcomp = [](Point l, Point r) { return l.x < r.x; }; auto ycomp = [](Point l, Point r) { return l.y < r.y; }; auto zcomp = [](Point l, Point r) { return l.z < r.z; }; Compare<Point> comp = { xcomp,ycomp,zcomp }; sort(v.begin(),v.end(),comp);
这段代码主要实现了对三维空间中的点进行排序的功能。首先定义了一个Point类,包含三个坐标x、y、z。然后定义了一个vector容器v,用于存储Point类型的点。
接下来定义了三个lambda表达式xcomp、ycomp、zcomp,分别用于按照x、y、z坐标对点进行排序。lambda表达式是C++11中的特性,用于定义一个匿名函数对象。这里定义的三个lambda表达式都接受两个Point类型的参数,返回值为bool类型。返回值为true表示第一个参数应该排在第二个参数之前。
最后定义了一个Compare结构体,包含了三个lambda表达式成员变量xcomp、ycomp、zcomp。Compare结构体实现了一个函数调用运算符operator(),接受两个Point类型的参数,根据xcomp、ycomp、zcomp成员变量进行比较,返回结果表示哪个点应该排在前面。
最后调用了sort函数,将vector容器v中的元素按照Compare对象comp进行排序。由于Compare对象包含了三个lambda表达式,因此sort函数可以分别按照x、y、z坐标进行排序。
如何在这段代码中增加将获取到的点根据点的分数剔除比例再次筛选void DyConcentricArc::RansacCircleFiler(const vector<Point2d>& points, vector<Point2d>& vpdExceptPoints, double sigma) { unsigned int n = points.size(); if (n < 3) { return; } RNG random; double bestScore = -1.; vector<Point2d>vpdTemp; int iterations = log(1 - 0.99) / (log(1 - (1.00 / n))); for (int k = 0; k < iterations; k++) { int i1 = 0, i2 = 0, i3 = 0; Point2d p1(0, 0), p2(0, 0), p3(0, 0); while (true) { i1 = random(n); i2 = random(n); i3 = random(n); if ((i1 != i2 && i1 != i3 && i2 != i3)) { if ((points[i1].y != points[i2].y) && (points[i1].y != points[i3].y)) { break; } } } p1 = points[i1]; p2 = points[i2]; p3 = points[i3]; //use three points to caculate a circle Point2d pdP12 = GetPPCenter(p1, p2); double dK1 = -1 / GetLineSlope(p1, p2); double dB1 = pdP12.y - dK1 * pdP12.x; Point2d pdP13 = GetPPCenter(p1, p3); double dK2 = -1 / GetLineSlope(p1, p3); double dB2 = pdP13.y - dK2 * pdP13.x; Point2d pdCenter(0, 0); pdCenter.x = (dB2 - dB1) / (dK1 - dK2); pdCenter.y = dK1 * pdCenter.x + dB1; double dR = GetPPDistance(pdCenter, p1); double score = 0; vpdTemp.clear(); for (int i = 0; i < n; i++) { double d = dR - GetPPDistance(points[i], pdCenter); if (fabs(d) < sigma) { score += 1; } else { vpdTemp.push_back(points[i]); } } if (score > bestScore) { bestScore = score; vpdExceptPoints = vpdTemp; } } }
可以在函数中增加一个参数,表示剔除分数较低的点的比例,比如设为ratio。在每次迭代的时候,先计算出剔除的点数为n*ratio,然后将点按照得分从小到大排序,再依次将得分较低的n*ratio个点删除,剩下的点作为下一次迭代的输入点。可以在函数中增加如下代码:
```cpp
void DyConcentricArc::RansacCircleFiler(const vector<Point2d>& points, vector<Point2d>& vpdExceptPoints, double sigma, double ratio) {
unsigned int n = points.size();
if (n < 3) {
return;
}
RNG random;
double bestScore = -1.;
vector<Point2d>vpdTemp;
int iterations = log(1 - 0.99) / (log(1 - (1.00 / n)));
for (int k = 0; k < iterations; k++) {
int i1 = 0, i2 = 0, i3 = 0;
Point2d p1(0, 0), p2(0, 0), p3(0, 0);
while (true) {
i1 = random(n);
i2 = random(n);
i3 = random(n);
if ((i1 != i2 && i1 != i3 && i2 != i3)) {
if ((points[i1].y != points[i2].y) && (points[i1].y != points[i3].y)) {
break;
}
}
}
p1 = points[i1];
p2 = points[i2];
p3 = points[i3];
//use three points to caculate a circle
Point2d pdP12 = GetPPCenter(p1, p2);
double dK1 = -1 / GetLineSlope(p1, p2);
double dB1 = pdP12.y - dK1 * pdP12.x;
Point2d pdP13 = GetPPCenter(p1, p3);
double dK2 = -1 / GetLineSlope(p1, p3);
double dB2 = pdP13.y - dK2 * pdP13.x;
Point2d pdCenter(0, 0);
pdCenter.x = (dB2 - dB1) / (dK1 - dK2);
pdCenter.y = dK1 * pdCenter.x + dB1;
double dR = GetPPDistance(pdCenter, p1);
double score = 0;
vpdTemp.clear();
for (int i = 0; i < n; i++) {
double d = dR - GetPPDistance(points[i], pdCenter);
if (fabs(d) < sigma) {
score += 1;
}
else {
vpdTemp.push_back(points[i]);
}
}
// sort points by score
sort(vpdTemp.begin(), vpdTemp.end(), [&](Point2d a, Point2d b) {
return GetPPDistance(a, pdCenter) < GetPPDistance(b, pdCenter);
});
// remove low-score points
int numToRemove = (int)(vpdTemp.size() * ratio);
for (int i = 0; i < numToRemove; i++) {
vpdTemp.erase(vpdTemp.begin());
}
if (score > bestScore) {
bestScore = score;
vpdExceptPoints = vpdTemp;
}
}
}
```
阅读全文