2017-06-23 28 views
0

キーに基づいてstd :: multisetに挿入された要素の数をカウントできるように、おそらくクラスの文字列演算子をオーバーロードしたいとします。 私は「」次のクラス指定されたタイプの合計オブジェクトを取得したいと思います:キーマルチセットの文字列演算子のオーバーロード

class Item 
{ 
public: 
    Item(); 
    Item(std::string type, float price); 

    friend bool operator <(const Item & lhs, const Item & rhs); 

    friend bool operator == (const Item & lhs, const Item & rhs); 

    virtual ~Item(); 

private: 
    std::string type_; 
    float price_; 
}; 

bool operator<(const Item & lhs, const Item & rhs) 
{ 
    return (lhs.price_ < rhs.price_); 
} 

bool operator == (const Item & lhs, const Item & rhs) 
{ 
    return (lhs.type_ == rhs.type_); 
} 

int main(){ 
     Item a("a", 99999); 
     Item b("b", 2); 
     Item c("c", 5); 
     Item d("d", 5); 
     Item e("e", 555); 
     Item f("f", 568); 
     Item g("a", 99999); 

    std::multiset <Item> items_; 

    items_.insert(a); 
    items_.insert(b); 
    items_.insert(c); 
    items_.insert(d); 
    items_.insert(g); 
    items_.insert(a); 

    auto tota = items_.count("a"); 

    return 0; 
    } 

を私はtota、この場合には2を返すことを期待します。 しかし、私はどのように進めるかを知りません。代わりにあなたがoperator<機能でそれを使用していないので、価格は何もすることができ

auto tota = items_.count("a"); 

使用

auto tota = items_.count(Item("a", 0)); 

答えて

1


私はoperator<機能についてミスをしました。それは価格を使用してです。あなただけのタイプによってルックアップすることができるようにしたい場合は、それを変更する必要があります。

bool operator<(const Item & lhs, const Item & rhs) 
{ 
    return (lhs.type_ < rhs.type_); 
} 

あなただけの文字列を使用してItem秒を検索することができるようにしたい場合は、する場合がありますstd::multiset<Item>の代わりにstd::multimap<std::string, Item>を使用してください。

+0

==演算子の意味ですか? – trexgris

+0

私はそのためのオブジェクトの作成を避けたいと思っていましたが、このケースで可能かどうかは分かりません... – trexgris

+0

@trexgris、no。 'std :: multiset'は' operator == 'を使用しません。 'operator <'だけ必要です。 –

関連する問題