0

我一直在尝试这个网站上提供的每一个技巧,但没有一个奏效,所以我将解释我的问题是什么。

我很想对包含指向对象的指针的向量进行排序,所以我不能使用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;
}
4

2 回答 2

0

您似乎在这里错过了冒号 void Graph:sortVertexPond(vector VertexVect) 。图表后:<-

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 类中存在一些问题。我希望它可以帮助您缩小问题的范围。

于 2012-06-15T10:18:34.983 回答
0

您正在将顶点向量按值传递给 sortVertexPond:

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

因此,您在调用该函数时正在制作副本,然后对副本进行排序,但原始内容不会更改。

尝试通过引用传递向量:

void Graph::sortVertexPond(vector<Vertex*>& VertexVect) // Note the '&'
于 2012-06-15T11:15:52.800 回答