質問

知っている 探す メソッドは指定されたキーを検索します std::マップ そして要素にイテレータを返します。とにかく値を見つけて要素へのイテレータを取得することはできますか?私がしなければならないのは、指定された値が std::map に存在することを確認することです。これは、マップ内のすべてのアイテムをループして比較することで行いました。しかし、これに対するより良いアプローチがあるかどうかを知りたかったのです。

ここに私が書いたものがあります

bool ContainsValue(Type_ value)
{
    bool found = false;
    Map_::iterator it = internalMap.begin(); // internalMap is std::map
    while(it != internalMap.end())
    {
        found = (it->second == value);
        if(found)
            break;
        ++it;
    }
    return found;
}

編集

値とキーの組み合わせを保存する別のマップを内部的に使用してみてはいかがでしょうか。それで、それに対して find を呼び出すことができますか?は 探す() std::map で順次検索を実行しますか?

ありがとう

役に立ちましたか?

解決

あなたは後押し:: multi_index 双方向マップをrel="noreferrer"> href="http://www.boost.org/doc/libs/1_37_0/libs/multi_index/doc/examples.html"

他のヒント

優れたものにアクセスできる場合は、 ブースト ライブラリを使用する必要があります boost::multi_index 作成する 双方向マップ マークが言うように。std::map とは異なり、これによりキーまたは値のいずれかで検索できます。

STL だけを手元に持っている場合は、次のコードでうまくいきます (mapped_type がoperator== をサポートするあらゆる種類のマップで動作するようにテンプレート化されています)。

#include <map>
#include <string>
#include <algorithm>
#include <iostream>
#include <cassert>

template<class T>
struct map_data_compare : public std::binary_function<typename T::value_type, 
                                                      typename T::mapped_type, 
                                                      bool>
{
public:
    bool operator() (typename T::value_type &pair, 
                     typename T::mapped_type i) const
    {
        return pair.second == i;
    }
};


int main()
{
    typedef std::map<std::string, int> mapType;

    mapType map;

    map["a"] = 1;
    map["b"] = 2;
    map["c"] = 3;
    map["d"] = 4;
    map["e"] = 5;

    const int value = 3;

    std::map<std::string, int>::iterator it = std::find_if( map.begin(), map.end(), std::bind2nd(map_data_compare<mapType>(), value) );

    if ( it != map.end() )
    {
        assert( value == it->second);
        std::cout << "Found index:" << it->first << " for value:" << it->second << std::endl;
    }
    else
    {
        std::cout << "Did not find index for value:" << value << std::endl;
    }
}
  

どのように値を格納し、内部で別のマップ、キーの組み合わせを使用する方法について。だから私はそれを見つける呼び出すことができます?

はい:1つのマップは、他のを使用してキーとその他のいずれかのタイプを使用して、二つのマップを維持する。

  

)(見つけるのstdに::マップは順次検索をしているのですか?

はありません、それはソートされた木のバイナリ検索です:。その速度はO(n個のログ())である。

ブーストの双方向マップに見て:ます。http: //www.boost.org/doc/libs/1_38_0/libs/bimap/doc/html/index.htmlする

これは、両方の値がキーのように振る舞うことができます。

それ以外の場合は、反復が進むべき道である。

この機能を試してみます:

template <class Map, class Val> typename Map::const_iterator MapSearchByValue(const Map & SearchMap, const Val & SearchVal)
{
    Map::const_iterator iRet = SearchMap.end();
    for (Map::const_iterator iTer = SearchMap.begin(); iTer != SearchMap.end(); iTer ++)
    {
        if (iTer->second == SearchVal)
        {
            iRet = iTer;
            break;
        }
    }
    return iRet;
}

私はそれが便利だと思います。

いいえ、あなたはSTD ::マップをループにしていて、手動ですべての値を確認してください。あなたが何をしたいのかに応じて、あなたはまた、STDのように、検索可能な簡単だし、重複を許可していない何かにマップに挿入されているすべての値をキャッシュする単純なクラスでのstd ::マップをラップすることができ::セットする。 std ::マップから継承しません(!それは仮想デストラクタを持っていない)が、あなたはこのような何かを行うことができるようにそれをラップます:

WrappedMap my_map< std::string, double >;
my_map[ "key" ] = 99.0;
std::set< double > values = my_map.values(); // should give back a set with only 99.0 in it

あなた自身の圧延する代わりに、簡単に、以下の記事にまたはGoogleが発見されたブースト双方向のマップを、使用することです。

それは本当にあなたがそれをしたいどのくらいの頻度、あなたが何をしたいかに依存しており、それはブーストをインストールして使用して対あなた自身の小さなラッパークラスをロールバックする方法は困難です。私はブーストを愛し、そのためには、行くには良い方法だ - しかし素晴らしく、独自のラッパークラスを作るについての完全な何かがあります。あなたは直接理解の利点操作の複雑さを持っている、とあなたはブースト双方向のマップが提供する価値観=>キーの完全な逆マッピングを必要としないことがあります。

あなたが要求していることはまさにのstd ::である(にはないことが判明しますないメンバー関数)

template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );

あまり最良の選択肢が、ユーザが初期化時に0またはNULLのようなデフォルト値を代入されたいくつかのケースで有用であるかもしれません。

Ex.
< int , string >
< string , int > 
< string , string > 

consider < string , string >
mymap["1st"]="first";
mymap["second"]="";
for (std::map<string,string>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
{
       if ( it->second =="" ) 
            continue;
}

誰かがここに来て、上記のC ++ 11と..

を探している場合、私は、この答えを追加してい
    //DECLARE A MAP
    std::map<int, int> testmap;

    //SAMPLE DATA
    testmap.insert(std::make_pair(1, 10));
    testmap.insert(std::make_pair(2, 20));
    testmap.insert(std::make_pair(3, 30));
    testmap.insert(std::make_pair(4, 20));

    //ELEMENTS WITH VALUE TO BE FOUND
    int value = 20;

    //RESULTS
    std::map<int, int> valuesMatching;

    //ONE STEP TO FIND ALL MATCHING MAP ELEMENTS
    std::copy_if(testmap.begin(), testmap.end(), std::inserter(valuesMatching, valuesMatching.end()), [value](const auto& v) {return v.second == value; });
私は完全にあなたが達成しようとしているのか理解していないことを

の可能性。しかし、単にマップに値が含まれているかどうかをテストするために、私はあなたがstd::mapに建てfindのを使用することができると信じています。

bool ContainsValue(Type_ value)
{
    return (internalMap.find(value) != internalMap.end());
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top