2015-06-19 4 views
1

У меня есть точка класса, которая представляет координату x и y и кривую класса , которые имеют две точки, начальную точку и конечную точку.Элементы сортировки в векторе кривых

class point { 
public: 
    double x{0.0}, y{0.0}; 
    //......... 
} 

class curve { 
public: 
    point start, end; 
    //......... 
} 

У меня есть вектор кривых, который необходимо сортировать. Начальная точка одной кривой равна конечной точке другой. Кривая выхода (удерживая одну кривую за другой) может быть открытой кривой или кривой закрытия (всегда непрерывной кривой).

Текущая логика с множеством циклов и 2/3 векторов. Есть ли способ реализовать то же самое с использованием стандартных алгоритмов (C++ 11).

+1

Это не проблема * сортировки *, это проблема * заказа *. Вам нужно знать, как найти порядок сортировки. – rlbond

ответ

1

Предполагая, что первый элемент вектора является отправной точкой пути, и что есть только одно решение, следующие строки будут делать работу:

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 и сделать подобный вызов поменять перед циклом:

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 для оператора == и !=. Вы также можете заменить их функциями

+1

Действительно, вы были правы, я снова посмотрю на него и испытаю ваш ответ, так как я нахожу этот интересный вопрос! – coincoin