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::multiset
std::unordered_multiset
operator==
operator<
this
class Note {
private:
int measureNumber;
public:
friend bool operator< (const Note ¬eOne, const Note ¬eTwo);
}
inline bool operator <(const Note& noteOne, const Note& noteTwo){
return noteOne.measureNumber < noteTwo.measureNumber;
}
このクラスは。と一緒に使用できますstd::multiset
。基本的なルックアップを実行するには、を除いて初期化されていない値でダミーオブジェクトを作成できますmeasureNumber
。これは単純なオブジェクトタイプでのみ機能します。