一对一的映射实际上非常简单,最快的方法可能是
二
地图,每个方向一张。如果不是一对一的话就变得更复杂了,因为你需要提供一种方法
收集
价值或关键,而不是单一的。幸运的是,你只有一对一的要求。
其中一个映射是您现在拥有的,另一个映射将值映射到给定的键,soboth将是:
std::map<:string int> forwardmapobj;
std::map reversemapobj;
这些将保持在
bidimap
某种类型的类。
无论何时插入或删除
比迪马普
,您必须对
二者都
内部地图。
例如,这里有一些伪代码。它维护两个映射,并确保它们在任何更改键和值的操作中保持同步:
class biDiMap:
map forwardMap
map reverseMap
void add(string key, int val):
if exists forwardMap[key]: throw exception 'duplicate key'
if exists reverseMap[val]: throw exception 'duplicate value'
forwardMapObj[key] = val
reverseMapObj[val] = key
void delKey(string key):
if not exists forwardMap[key]: throw exception 'no such key'
delete reverseMap[forwardMap[key]]
delete forwardMap[key]
void delVal(int val):
if not exists reverseMap[val]: throw exception 'no such value'
delete forwardMap[reverseMap[val]]
delete reverseMap[val]
int getValFor(string key): return forwardMap[key]
string getKeyFor(int val): return reverseMap[val]
显然,有很多
其他
你可以添加的东西,但这应该是基础。无论如何,你可能
足够地
前面的工作把它变成C++类:
如果你
不要
想要推出自己的解决方案,那么Boost有一个非常好的解决方案,您可以很好地使用它。
Boost.Bimap
提供完全模板化的双向映射,您应该能够使用最少的代码,例如以下完整的程序:
#include
#include
#include
using std::string;
using std::cout;
using std::exception;
using boost::bimap;
int main()
{
typedef bimap SiMap;
typedef SiMap::value_type SiEntry;
SiMap bidi;
bidi.insert(SiEntry("ninety-nine", 99));
int i = 0;
for (string str: {"one", "two" , "three", "four", "five", "six"}) {
bidi.insert(SiEntry(str, ++i));
}
cout << "The number of entries is " << bidi.size() << "\n\n";
for (auto i = 1; i <= 7; i += 3) {
try {
cout << "Text for number " << i << " is " << bidi.right.at(i) << "\n";
} catch (exception &e) {
cout << "Got exception looking up number " << i << ": " << e.what() << "\n";
}
}
cout << "\n";
for (auto str: {"five", "ninety-nine", "zero"}) {
try {
cout << "Number for text '" << str << "' is " << bidi.left.at(str) << "\n";
} catch (exception &e) {
cout << "Got exception looking up text '" << str << "': " << e.what() << "\n";
}
}
cout << "\n";
return 0;
}
它在数字的文本形式和整数值之间创建一个双向映射,然后进行一些查找(在两个方向)以显示它的工作原理:
The number of entries is 7
Text for number 1 is one
Text for number 4 is four
Got exception looking up number 7: bimap<>: invalid key
Number for text 'five' is 5
Number for text 'ninety-nine' is 99
Got exception looking up text 'zero': bimap<>: invalid key