0

カスタムコンパレータ関数を使用してオブジェクトをC++に格納したいのですがstd::map、例:

std::map<Part, Inventory, PartCmp> 

コンパレータについては、計算にコストがかかる可能性のある「キー」でオブジェクトを並べ替えたいので、遅延評価方法を考えました。以下の例は些細なことですが、問題を示しています。

class Part {
public:
   std::string item_id;
   int color_id;
   int condition;
   std::string name;
   std::string category;

   std::string key();       
private:
   std::string key_;
}

std::string Part::key() {
    // Only create key value if it hasn't been done before
    if (key_.empty()) {
        ostringstream keystream;
        keystream << item_id << color_id << condition;
        key_ = keystream.str();
    }
    return key_;
}

これは、私のコンパレータが次のように見えることを意味します。

struct PartCmp {
    bool operator() (Part& p1, Part& p2) const {
        return p1.key() < p2.key();
    }
};

これは、パラメータとして宣言されてp1いる他のすべての例とは異なります。p2const

ただし、この場合p1、メソッドがそれぞれのオブジェクトを変更するため、p2として宣言することはできません。コードはコンパイルされますが、これは悪いことですか?constkey()

4

1 に答える 1

5

フィールドを宣言することをお勧めします

private:
   mutable std::string key_;

この質問を参照してください。

また、juanchopanzakey()からのコメントで示唆されているように、あなたの方法を作ってくださいconst

最後に、あなたは怠惰な評価ではなく、メモ化を行っていると思います。

于 2013-01-17T20:36:40.273 に答える