2016-03-31 44 views
3

我需要通過傳入值可能具有的任何鍵來訪問值的方法。 例如,可以通過他們的IP地址或名稱訪問的播放器對象?用C++中的多個鍵之一訪問相同的值?

舉例說明。

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

你可以使用兩個'std :: map's通過相應的鍵具有相同的對象引用。每次你添加/刪除一個對象只需更新兩個地圖。 –

+0

如何通過處理其中一個地圖來從兩個地圖中刪除參考? – 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

我需要一個_key-key-value_,因爲value將是_PlayerObject_而不是散列字符串。 – Neuro

0

假設你有一個播放器數組和2個指向起始點的char指針和ip地址的指針數組。 不管什麼搜索算法你使用bjt包括searchin和little if語句。例如: 如果(incoming_value_size == 1)//這是一個char VAL 然後 搜索通過set1array 否則 Set2array設置

//如果你的球員排序,你可以找到一個與他們的鄰居值whicj你用2個指針表示。獲取索引,你會沒事

+0

我這麼做很多,但是這一次,當玩家在不可知的時間點被添加和移除時,數組之間可能會混亂起來,而且在我的情況下,按鍵搜索對於地圖來說會更快。我一次會有5到500名玩家。搜索矢量或平面數組速度太慢。 – Neuro

相關問題