1

私は次のコードを持っています:

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;
}

ColorMapが定義されている場所

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

そして、基本的に検索関数が存在しないという長いテンプレートエラーが発生し続けます。でも

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

正常にコンパイルされます。
検索関数は、特定のコレクションタイプのbimapでのみ定義されているという予感があります。wxColourは比較できないため、set_ofwxColoursを使用できません。(それはどういう意味ですか?)コレクションタイプをlist_ofに変更しようとしましたが、それも機能しませんでした。bimapを使用する上での私の全体的なポイントは、どちらの方向にも進む値を見つけることができるようにすることでした。間違ったコンテナを使用していますか?検索関数を使用できるようにするwxColourに使用できる別のコレクションタイプはありますか?

編集: 私は自分のコンテナクラスを作成することになりました。

4

1 に答える 1

6

Bimapを使用すると、各サイドのマッピングタイプを定義できます。アプリケーションでクイック検索を実行する必要がある場合は、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を使用して実装できます。

よろしくお願いします

于 2012-02-06T09:42:02.293 に答える