2012-02-04 8 views
1

私は、次のコードを持っている:のfind()ブースト2領域マップに問題

wxString getColorName(const wxColour& color) 
{ 
    typedef ColorComboBox::ColorMap::right_const_iterator ConstColorIterator; 
    ColorComboBox::ColorMap colorMap = ColorComboBox::getDefaultChoices(); 
    ConstColorIterator it = colorMap.right.find(color); 
    return it != colorMap.right.end() ? it->second : 
      ColorComboBox::CUSTOM_COLOR; 
} 

カラーマップ

typedef boost::bimaps::bimap \ 
      <wxString, boost::bimaps::vector_of<wxColour> > \ 
      ColorMap; 

定義されており、私は基本的には検索機能がないと言う長いテンプレートのエラーを取得しておきます存在する。しかし、

ColorMap::left_const_iterator it = choices_.left.find(GetValue()); 

コンパイルは正常です。
私は、find関数がbimapの特定のコレクション型でのみ定義されていることを知っています。 wxColourは比較できないので、私はset_of wxColoursを使うことはできません。 (それはどういう意味ですか?)またコレクションタイプをlist_ofに変更しようとしましたが、それもうまくいきませんでした。 bimapを使用することの私の全体的なポイントは、私がどちらかの方法で値を見つけることができるようにすることでした。間違った容器を使用していますか? wxColourのために私がfind関数を使うことを可能にする別のコレクション型がありますか?

編集: 私は独自のコンテナクラスを作成しました。

答えて

4

Bimapでは、各面のmapping typeを定義することができます。アプリケーションでクイック検索を実行する必要がある場合は、map/multimapまたはunordered_map/unordered_multimapベースのマッピングを使用します。マニュアルを読み、各マップビューは同等のSTLコンテナをモデルにしたので、彼らは同じ制約とインターフェイスを共有していることを忘れないでください:

  • set_of(ユニーク、注文) - >std::map
  • multiset_ofを(注文) - >(ハッシュ化された、ユニークな)std::multimap
  • unordered_set_of - >std::unordered_map
  • unordered_multiset_of(ハッシュされた) - >std::unordered_multimap
  • list_of(配列決定さ) - > list_map(std::list<pair>
  • vector_of(ランダムアクセス) - > vector_map(std::vector<pair>
  • unconstrained_set_of - あなたはvector_of<wxColour>を選ぶ理由>

をマッピングされていない、私は理解していませんset_of<wxColour>(デフォルト)がコンパイルされなかったからかもしれません...この場合、あなたが述べたように、独自の比較演算子を定義して、これらのアイテムの順序をbimapに指示する必要があります。ベクタマッピングとリストマッピングは、リレーションシップの挿入順序を保持するバイマップを作成できるようにするためのものです。

あなたの場合、あなたが望むものはunordered_set_ofです。 wxColourの独自のハッシュ関数を定義する必要があります。 Boost.Hashを使って実装することができます。

お礼

+0

ありがとうございます!あなたの答えはよかったので、私は別の解決策をとっていました。 – Eva