我有一个类点,它表示x和y坐标和类曲线有两个点,起点和终点。
class point {
public:
double x{0.0}, y{0.0};
//.........
}
class curve {
public:
point start, end;
//.........
}
我有一个曲线向量,需要排序。一条曲线的起点等于另一条曲线的终点。输出曲线(保持一条曲线接一条)可以是开曲线或闭曲线(始终是连续曲线)。
具有大量循环和 2/3 向量的当前逻辑。有没有办法使用标准算法(c ++ 11)实现相同的方法。
假设向量的第一个元素是路径的起点,并且只有一个解决方案,以下行将完成这项工作:
bool operator!=(point& a,point& b) {
return !(a.x == b.x && b.y == a.y);
}
bool operator==(point& a, point& b) {
return (a.x == b.x && b.y == a.y);
}
void order(std::vector<curve>& vin) {
auto it = vin.begin();
auto end = vin.end();
while (it+1 != end) {
if (it->end != (it + 1)->start) {
std::swap(*(it + 1), *std::find_if(it + 2, end, [it](curve& c){ return c.start == it->end ; }));
}
++it ;
}
}
如果需要查找第一个元素,只需定义一个谓词is_the_beginning并在循环之前执行类似的调用 swap:
bool is_the_beginning(curve& c) {
if ( ... ) return true;
else return false ;
}
std::swap(*it, *std::find_if(it+1, end, is_the_beginning ) ) ;
也许您需要考虑操作员double
的精度 ==
和 !=
.您也可以通过函数替换它们