-1

次のように定義されたEdgeクラスがあります

class Edge {
public:
    //constructors & destructors
    Edge();
    Edge(const Edge& orig);
    virtual ~Edge();
    Edge(unsigned const int, const string&, const string&);

    //getters & setters
    unsigned int GetCost() const {return cost;}

    //member functions
    bool operator<(const Edge*) const;
private:
    unsigned int cost;  //cost of the edge
    string cities[2];   //cities that the edge connect
};

//cpp file
bool Edge::operator<(const Edge* e) const {
    cout << "edge" << endl;  //function is never invoked
    return this->cost < e->GetCost();
}

これらのエッジ (最初はベクターに含まれている) を Edge* セットに保持したいのですが、対応する main() のコードは次のとおりです。

set<Edge*> edge_set;
vector<Edge*> edges;

print_vector(edges);
srand((unsigned)time(NULL));
while(edge_set.size() < K){ //randomly pick K edges that will form the tree
    edge_set.insert(edges[rand()%edges.size()]);
}
print_set(edge_set);

出力が得られます:

Edge vector:
edges[0] cost = 136
edges[1] cost = 558
edges[2] cost = 872
edges[3] cost = 1615
edges[4] cost = 654
edges[5] cost = 994
.
.
.

Edge set:
858
1242
436
636
804

メインでも演算子をオーバーロードする関数を定義しようとしました<が、このセットをそのように並べ替えることができませんでした。つまり、オーバーロード<された演算子を呼び出すことができませんでした。また、オーバーロードのパラメーターの型 (参照、ポインター、オブジェクト自体) が異なることにも注意してください<

ここで何が間違っていますか?この問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

operator <両方のポインターが必要です。言語規則によって非現実的であり、演算子はオブジェクトとポインター用であるため、デフォルトのもの ( std::less<Edge*>) が使用されます。オブジェクトを保存するか、ポインタで動作するファンクタを記述して使用することができます ( setobject は のように宣言する必要がありますstd::set<Edge*, Functor>)。

このような

struct CompareCost : public std::binary_function<const Edge*, const Edge*, bool>
{
   result_type operator () (first_argument_type f, second_argument_type s)
   {
      return f->operator <(s);
   }
};

std::set<Edge*, CompareCost> edge_set;
于 2013-04-11T09:09:06.597 に答える