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

頂点ベクトルを値でsortVertexPondに渡します。

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

したがって、その関数を呼び出してからコピーを並べ替えるときにコピーを作成しますが、元のコピーは変更されません。

参照によってベクトルを渡してみてください:

void Graph::sortVertexPond(vector<Vertex*>& VertexVect) // Note the '&'
于 2012-06-15T11:15:52.800 に答える
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 に答える