Метод Sort в STL не может поменять содержимое в векторе - PullRequest
0 голосов
/ 13 января 2019

Я пытался реализовать алгоритм Крускала (реализация Введение в алгоритмы CLRS), используя C ++. Но при попытке отсортировать набор Edge (который является классом, который я создал) (который я реализовал как вектор) с использованием std :: sort, он не работает. Я пытался использовать лямбда-функцию в качестве компаратора, а также перегруженный оператор «<». </p>

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 Ответ

0 голосов
/ 13 января 2019

Ваши операторы присваивания немного нестандартны и возвращают ссылки на объекты, которых больше не существует.

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

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;
}

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

...