2016-04-18 2 views
3

私はSTLを使用して値とペアを保存する方法値を持つペアを保存するために使用するdatastructureまたはstl?

**"London","Paris" -> 10 
"New York","Japan" -> 100 
"London","Japan" -> 200** 
.. 

のようなデータを持っていますか?マップはキーと値だけを許可し、余分なキーは許可しません。

キーを2つの値を保持する余分なオブジェクトで保存できます。

map < string, Object> 

しかし、私はオブジェクトを解析する余分なステップを経なければならず、オーバーヘッドになります。

でも、私はリンクされたリストを使って自分の仕事をすることができます。しかし、それを保存してアクセスする他の効率的な方法はありますか?または私は正しい方向に考えていますか?私はSTLの新人です。

+5

'map 、int>'おそらく –

+0

@MM STLの経験豊かなユーザーに見えるかもしれないので、std :: pair <匹敵する。これは答えでなければなりません –

+0

@RichardHodges TBHを思い出すことができませんでしたが、誰かがそうではないと答えた場合は、カスタムコンパレータの作成方法を提案しました –

答えて

4

std::unordered_mapstd::pair<std::string, std::string>からintのいずれかを使用できます。

std::mapは簡単です。std::map<std::pair<std::string, std::string>, int>を使用してください。標準ライブラリーはすでにペアを比較する方法を知っています。

ただし、注文する必要がない場合は、ハッシュベースの辞書を使用する方がよい場合があります。 this questionから借りて、最初にこの定義:

struct pairhash { 
public: 
    template <typename T, typename U> 
    std::size_t operator()(const std::pair<T, U> &x) const 
    { 
     return std::hash<T>()(x.first)^std::hash<U>()(x.second); 
    } 
}; 

(。より良いバージョンのトニーDによって下記のコメントを参照)

今、あなたはstd::unordered_map<std::pair<std::string, std::string>, int, pairhash>を使用することができます。


(例えば、<map><unordered_map>、それぞれ)もまた、適切なヘッダーを含めてください。順序付けられていないバージョンでは、C++ 11の設定でビルドしていることを確認する必要があります。

+0

ありがとうございました。私はあなたとM.によって答えられたと思います、私のために働くでしょう。私はSTLに向かって頭をいっぱいにする必要があります。しかし、私は先に進むべき方向性を持っています。 –

+2

'std :: hash ()(x.first)^ std :: hash ()(x.second);'はひどく衝突しやすい - 'first == second'が0にハッシュされる' '(a、b)は'(b、a) 'と衝突します。これらの状況はOPのデータには当てはまらないかもしれませんが、一般的には、 'boost :: hash_combine'の短期間で停止した場合でも' std :: hash ()(x.first)^(std :: hash ()(x .second)<< 3)^(std :: hash ()(x秒)>> 2); '*もっと*良いです。 –

+0

@TonyD多くのありがとう - あなたのコメントを参照するように更新されました。 –

関連する問題