Метод Sort в STL не может поменять содержимое в векторе
Я пытался реализовать алгоритм Крускала (реализация Введение в алгоритмы CLRS), используя C++. Но при попытке отсортировать набор Edge (который является классом, который я создал) (который я реализовал как вектор) с использованием std::sort, он не работает. Я попытался использовать лямбда-функцию в качестве компаратора, а также перегруженный оператор "<".
std::vector <Edge> givenEdgeSet;
Это вызов функции
std::sort(givenEdgeSet.begin(), givenEdgeSet.end());
И перегруженное определение оператора
bool operator < (const Edge& b){
//length is the edge length here..
return (length < b.length);
}
Проблема заключается в обмене объектами в векторе (чего не происходит)
Я определил конструкторы копирования и перемещения и операторы присваивания. Может ли это быть проблемой в конструкторах?
// копировать конструктор
Edge(const Edge& e){
start_point = e.start_point;
end_point = e.end_point;
length = e.length;
start_vertex_set = e.start_vertex_set;
end_vertex_set = e.end_vertex_set;
}
// копировать оператор присваивания
Edge& operator = (const Edge& e){
std::shared_ptr<Edge> NewEdge(new Edge());
NewEdge->start_point = e.start_point;
NewEdge->end_point = e.end_point;
NewEdge->length = e.length;
NewEdge->start_vertex_set = e.start_vertex_set;
NewEdge->end_vertex_set = e.end_vertex_set;
return *NewEdge;
}
// Переместить конструктор
Edge(const Edge&& e){
start_point = e.start_point;
end_point = e.end_point;
length = e.length;
start_vertex_set = e.start_vertex_set;
end_vertex_set = e.end_vertex_set;
}
// Переместить оператор присваивания
Edge& operator = (const Edge&& e){
std::shared_ptr<Edge> NewEdge(new Edge());
NewEdge->start_point = e.start_point;
NewEdge->end_point = e.end_point;
NewEdge->length = e.length;
NewEdge->start_vertex_set = e.start_vertex_set;
NewEdge->end_vertex_set = e.end_vertex_set;
return (*NewEdge);
}
1 ответ
Ваши операторы присваивания немного необычны и возвращают ссылки на объекты, которые больше не существуют.
Предполагается, что операторы присваивания присваивают текущему объекту и возвращают этот объект, а не новый:
Edge& operator = (const Edge& e){
start_point = e.start_point;
end_point = e.end_point;
length = e.length;
start_vertex_set = e.start_vertex_set;
end_vertex_set = e.end_vertex_set;
return *this;
}
Вы можете опустить свой конструктор / оператор перемещения, так как они все равно только копируют данные, поэтому не дают никакой выгоды.