0

unordered_multimapNoteオブジェクトにを使用する必要があります。キーはmeasureNumberオブジェクトのメンバーになります。ここに示すように実装しようとしていますが、行き詰まっています。

operator==まず、使用する前に上書きしなければならない理由がわかりません。また、ハッシュが必要な理由とその実装方法についても混乱しています。この例では、これら2つのことはいずれも実行されていません。

したがって、最初の例に基づいて、これは私が持っているものです:

class Note {
private:
    int measureNumber;
public:
    inline bool operator== (const Note &noteOne, const Note &noteTwo);
}

inline bool Note::operator ==(const Note& noteOne, const Note& noteTwo){
    return noteOne.measureNumber == noteTwo.measureNumber;
}

ハッシュ部分の実装方法はわかりませんが。何か案は?

4

2 に答える 2

0

std::multimapは、ノードをソートするために小なり操作を使用する、ソートされた二分木に基づいています。

std::unordered_multimapはハッシュテーブルに基づいており、ハッシュ操作と等式操作を使用して、ノードを並べ替えずに整理します。

並べ替えまたはハッシュは、キー値に基づいています。オブジェクトがキーである場合は、これらの操作を定義する必要があります。キーがまたはのような事前定義されたタイプであるint場合string、それについて心配する必要はありません。

擬似コードの問題measureNumberはプライベートであるため、のユーザーはNoteマップのキーを簡単に指定できません。measureNumber公開するか、デザインを考え直すことをお勧めします。(メジャー番号は本当に良いキー値ですか?これは記譜法だと思います。)

std::multimap< int, Note > notes;
Note myNote( e_sharp, /* octave */ 3, /* measure */ 5 );
notes.insert( std::make_pair( myNote.measureNumber, myNote ) );

またはを使用する場合、オブジェクトはキー値を同時に使用できます。その場合、演算子のオーバーロード(および場合によってはハッシュ)を定義する必要があります。(または)がメンバー関数の場合、左側がになり、右側が唯一の引数になります。通常、これらの関数は非メンバーの友達である必要があります。だからあなたはstd::multisetstd::unordered_multisetoperator==operator<this

class Note {
private:
    int measureNumber;
public:
    friend bool operator< (const Note &noteOne, const Note &noteTwo);
}

inline bool operator <(const Note& noteOne, const Note& noteTwo){
    return noteOne.measureNumber < noteTwo.measureNumber;
}

このクラスは。と一緒に使用できますstd::multiset。基本的なルックアップを実行するには、を除いて初期化されていない値でダミーオブジェクトを作成できますmeasureNumber。これは単純なオブジェクトタイプでのみ機能します。

于 2012-04-12T01:16:19.153 に答える
0

Noteオブジェクトにunordered_multimapを使用する必要があり、キーはオブジェクトのmeasureNumberメンバーになります。

OK-あなたが、、、、またはの後にいるのかわかりmultisetませunordered_multisetん。あなたのタイトルがを参照していることは知っていますが、あなたが提供したリンクはにつながります。コンテナーを選択する際に考慮すべき考慮事項は多数ありますが、プロファイリングなしで最高のパフォーマンスを発揮する2番目の推測はリスクの高いビジネスです。multimapunordered_multimapunordered_multimapunordered_multiset

使用する前にoperator==を上書きする必要がある理由がわかりません。また、ハッシュが必要な理由とその実装方法についても混乱しています。この例では、これら2つのことはいずれも実行されていません。

とが必要です。これらはoperator==std::hashによって内部的に使用されunordered_multimapますunordered_multiset。リンクした例では、キーはタイプintであるためoperator==std::hash<int>すでに定義されています。キーとして使用する場合Noteは、これらを自分で定義する必要があります。


multiset要素を頻繁に変更する必要がない場合は、から始めることをお勧めします。を消去したり挿入したりせずにを変更できるようにたい場合は、のメンバーとして削除して使用することをお勧めします。NotemeasureNumberNotemultimap<int, Note>

unordered_コンテナのバージョンがニーズに適していると思われる場合でも、 setvsをmap選択できます。を選択した場合unordered_multimap<int, Note>(から削除measureNumberした場合Note)、リンクされた例のように、キーはintです。したがって、これが機能するために特別なことを定義する必要はありません。measureNumberのメンバーとして保持してNote使用することを選択した場合unordered_multiset<Note>Note、が重要であるため、さらに作業を行う必要があります。

#include <functional>
#include <unordered_set>

class Note;  // Forward declaration to allow specialisation of std::hash<>

namespace std {
template<>
class hash<Note> {
public:
    size_t operator()(const Note &) const;  // declaration of operator() to
                                            // allow befriending by Note
};
}

class Note {
private:
    int measureNumber;
public:
    // functions befriended to allow access to measureNumber
    friend bool operator== (const Note &, const Note &);
    friend std::size_t std::hash<Note>::operator()(const Note &) const;
};

inline bool operator== (const Note &noteOne, const Note &noteTwo) {
    return noteOne.measureNumber == noteTwo.measureNumber;
}

std::size_t std::hash<Note>::operator()(const Note &note) const {
    return std::hash<int>()(note.measureNumber);
}

これにより、を作成して使用できますstd::unordered_multiset<Note>。ただし、これ本当に必要なものかどうかはわかりません。ソートstd::vector<Note>が最適であることがわかる場合もあります。プロファイリングと一緒にコンテナをどのように使用するかについてのさらなる調査と考察が最良の答えを与えるはずです。

于 2012-04-12T03:11:50.533 に答える