Метод 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;
}

Вы можете опустить свой конструктор / оператор перемещения, так как они все равно только копируют данные, поэтому не дают никакой выгоды.

Другие вопросы по тегам