2012-06-15 5 views
0

Я пробовал каждый совет, предоставленный на этом сайте, но никто не работал, поэтому я собираюсь объяснить, в чем моя проблема.std :: sort не сортирует вектор

Я являюсь tyring для сортировки вектора, содержащего указатели на объекты, поэтому couse Я не могу использовать синтаксис std::sort(vector.begin(), vector.end()), потому что он будет использовать оператор «<» для указателей. Вот пример моего кода:

// Vertex.h 
class Vertex 
{ 
    public : 
     inline int getPond() const {return m_Pond;} 

    private : 
     int m_Pond; 
} 

.

//Graph.h 
class Graph 
{ 
    public : 
     void sortVertexPond(vector<Vertex*> VertexVect); 
     inline bool compareVertex(const Vertex* LeftVertex, const Vertex* RightVertex){return (LeftVertex->getPond() < RightVertex->getPond());} 
     void testFunct(); 

    private : 
     vector<vector Vertex*>> m_VertexByLayers; 
} 

.

//Graph.cpp 
#include <algorithm> 

void Graph::sortVertexPond(vector<Vertex*> VertexVect) 
{ 
    std::sort(VertexVect.begin(), VertexVect.end(), compareVertex); 
    //std::sort(VertexVect.begin(), VertexVect.end(), compareVertexStruct()); 
} 

/*struct compareVertexStruct { 
bool operator()(Vertex* LeftVertex, Vertex* RightVertex) {return (LeftVertex->getPond() < RightVertex->getPond()); } 
};*/ 

void testFunct() 
{ 
    this->sortVertexPond(m_VertexByLayers.at(0)); 
} 

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

error C2780: 'void std::sort(_RanIt,_RanIt)' : 2 arguments expected - 3 provided 

Как вы можете видеть в коде я представил, я уже пытался это сделать, создав Functor. Таким образом, я не добавляю проблем с компиляцией и запуском, что странно, что даже если мой функтор был вызван (что я мог видеть, добавляя cout внутри моего оператора), std :: sort ничего не сортировал.

Я имел такого рода результаты:

Input : [3,2,1] 
3<2? 0 
2<1? 0 
Output : [3,2,1] 

Input : [1,2,3] 
1<2? 1 
2<3? 1 
Output : [1,2,3] 

Может понравиться кто-нибудь помочь мне исправить это?

PS: Извините за мой английский, это не мой родной язык.

Редактировать: Спасибо всем. Вот что я сделал, чтобы исправить это.

//Graph.h 
class Graph 
{ 
    public : 
     vector<Vertex*> sortVertexPond(vector<Vertex*> VertexVect); 
} 


//Graph.cpp 
#include <algorithm> 

struct compareVertexStruct {bool operator()(Vertex* LeftVertex, Vertex* RightVertex) {return (LeftVertex->getPond() < RightVertex->getPond());}}; 

vector<Vertex*> Graph::sortVertexPond(vector<Vertex*> VertexVect) 
{ 
    std::sort(VertexVect.begin(), VertexVect.end(), compareVertexStruct()); 
    return VertexVect; 
} 
+0

Я не проверил все это, но в функторе, вы сравниваете LeftVertex-> getPond() с самим собой. – MikMik

+0

Спасибо за указание этой проблемы с опечаткой, исправлено. – Illmess

ответ

0

Вы передаете свой вектор вершины по значению sortVertexPond:

void Graph::sortVertexPond(vector<Vertex*> VertexVect) 

Таким образом, вы делаете копию при вызове этой функции, а затем сортировки копию, но оригинал не изменился.

Попробуйте прохождение вектора по ссылке:

void Graph::sortVertexPond(vector<Vertex*>& VertexVect) // Note the '&' 
+0

Ну, спасибо большое, я до сих пор не понимаю, как я мог это пропустить. Ты все равно спасал мой день! – Illmess

+1

@Illmess Не то, чтобы я охотник за репрессом, но этикет вокруг здесь состоит в том, что если ответ решает вашу проблему, тогда вы должны принять этот ответ. – MikMik

0

Вы, кажется, пропустили двоеточие пустот Graph: sortVertexPond (вектор VertexVect) здесь. После Graph: < -

int main(){ 
    Vertex v1(3), v2(2), v3(1); 
    vector<Vertex*> v; 

    v.push_back(&v1); 
    v.push_back(&v2); 
    v.push_back(&v3); 

    for(int i=0; i<3; i++) cout << (v.at(i))->getPond() << " "; cout << endl; 
    sort(v.begin(), v.end(), compareVertex); 
    for(int i=0; i<3; i++) cout << (v.at(i))->getPond() << " "; cout << endl; 

    return 0; 
} 

Ваша функция сравнения и сортировки, кажется, работает хорошо. Однако в вашем классе Graph есть некоторые проблемы. Надеюсь, это поможет вам сузить проблему.

+0

То же, что и выше, спасибо. – Illmess