2016-03-31 16 views
3

値にアクセスできる方法は、その値が持つことができる任意のキーを渡してください。 たとえば、IPアドレスまたは名前のいずれかでアクセスできるプレーヤーオブジェクトですか?C++の複数のキーの1つで同じ値にアクセスしますか?

説明する。

Player1 has ["a", "1.2.3.4"] Player2 has ["b", "3.4.5.6"] Player3 has ["c", "2.2.9.3"]

だから、Player2私は players["b"]を使用することができますアクセスする、または players["3.4.5.6"]

は、私はちょうどそれのためのベクトルを反復処理する必要がありますか?しかし、私は約100の要素を持つことを計画しているので、ツリーのようなコンテナは配列リストより優れていますか?

これにはstd::multimapを使用できますか? std::mapでもですか?

+0

おそらく必要なのは['boost.bimap'](http://www.boost.org/doc/libs/1_60_0/libs/bimap/doc/html/index)です。 html) – 101010

+2

対応するキーによってオブジェクトに対して同じ参照を持つ2つの 'std :: map'を使うことができます。オブジェクトを追加/削除するたびに、両方のマップを更新するだけです。 –

+0

マップの1つを扱うことによって、両方のマップから参照をどのように削除しますか? – Neuro

答えて

2

ipnameが一意であることを確認してください。

map<string, Player> byNameMap; 
map<string, Player> byIpMap; 

void add(Player p) { 
    byNameMap[p.name] = p; 
    byIpMap[p.ip] = p; 
} 

void remove(Player p) { 
    byNameMap.erase(byNameMap.find(p.name)); 
    byIpMap.erase(byIpMap.find(p.ip)); 
} 

// assuming you are sure player with such name exists 
void removeByName(string name) { 
    remove(byNameMap[name]); 
} 

// assuming you are sure player with such ip exists 
void removeByIp(string ip) { 
    remove(byIpMap[ip]); 
} 
+0

あなたの地図の内容は無関係であることに注意しましょう。私は 'byNameMap.at(name).score ++;'は 'byIpMap'から変更しないことを意味します。 – Jarod42

1

あなたは、以下の例のようboost.bimapを使用することができます。

#include <iostream> 
#include <string> 
#include <boost/bimap.hpp> 

int main() { 
    typedef boost::bimap<std::string, std::string> Ipmap; 
    typedef Ipmap::value_type NameIpPair; 

    Ipmap players; 
    players.insert(NameIpPair("a", "1.2.3.4")); 
    players.insert(NameIpPair("b", "5.6.7.8")); 
    players.insert(NameIpPair("c", "9.10.11.12")); 

    std::cout << players.left.at("b") << std::endl; 
    std::cout << players.right.at("5.6.7.8") << std::endl; 
} 

Live Demo

+0

値は_PlayerObject_であり、ハッシュされた文字列ではないので、_key-key-value_が必要です。 – Neuro

0

あなたはchar配列とipアドレスである開始点を指すプレーヤー配列と2つのポインタ配列を持っているとします。 bjtを使用する検索アルゴリズムには、searchinとlittle if文の両方が含まれます。たとえば、次のように もし 検索set1array そうでない場合 Set2arrayに設定されてその後のchar valの である(incoming_value_size == 1)//

//あなたのプレイヤーがソートされた場合、あなたは彼らの隣人値を持つものを見つけることができますwhicjあなたは2つのポインタで表されます。インデックスを取得するとあなたは大丈夫でしょう

+0

私はこれをたくさんしていますが、今回はプレイヤーが認識できない時点で追加されたり削除されたりすると、配列間で混乱する可能性が非常に高くなります。私は、一度に5人から500人のプレイヤーを抱えています。ベクトルやプレーンな配列を使って検索するのが遅すぎる。 – Neuro

関連する問題