使用 C++ 中的多个键之一访问相同的值?
Access same value with one of multiple keys in c++?
我需要一种通过传入值可能具有的任何键来访问值的方法。
例如,可以通过其 ip 地址或名称访问的播放器对象?
举例说明。
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
?
您可以使用 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;
}
确保 ip
和 name
是唯一的。
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]);
}
假设你有一个播放器数组和2个指向起点的指针数组,它们是char值和ip地址。
不管你使用什么搜索算法,bjt 都包括 searchin with 和 little if 语句。例如:
if(incoming_value_size ==1)//这是一个char val
然后
在 set1array 中搜索集合
除此以外
Set2数组
//如果你的球员排序,你可以找到一个有他们的邻居值的人,你用 2 个指针表示。获取索引就可以了
我需要一种通过传入值可能具有的任何键来访问值的方法。 例如,可以通过其 ip 地址或名称访问的播放器对象?
举例说明。
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
?
您可以使用 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;
}
确保 ip
和 name
是唯一的。
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]);
}
假设你有一个播放器数组和2个指向起点的指针数组,它们是char值和ip地址。 不管你使用什么搜索算法,bjt 都包括 searchin with 和 little if 语句。例如: if(incoming_value_size ==1)//这是一个char val 然后 在 set1array 中搜索集合 除此以外 Set2数组
//如果你的球员排序,你可以找到一个有他们的邻居值的人,你用 2 个指针表示。获取索引就可以了