Supose i have
(A,B)
(A,C)
(A,D)
(B,C)
(B,D)
(C,D)
(D,E)
在文本文件中。我将使用正则表达式提取它。
我想将数据插入到容器中,使其看起来像这样。
A->B,C,D
B->C,D
C->D
D->E
我使用哪个容器?</ p>
我需要能够在容器的左手侧和右手侧查找数据,即通过键值。所以我需要能够搜索/查找
A,B,C,D
A->B,C
B->C,D
C->D
D->E
和B,C in
A->B,C
答案 0 :(得分:6)
std::multimap浮现在脑海中......基本上是一张地图,但允许在地图键中复制(即你可以有多个“A”键,每个键映射到“B”,“C”或“ D“键,继续你的例子。”
编辑:为了回应Chris的评论:您以与地图相同的方式将项目插入到多图中 - 您创建包含键和值的std::pair
对象,然后{ {3}}进入multimap:
std::multimap<char, char> myMap;
myMap.insert(std::pair<char, char>('A', 'B'));
myMap.insert(std::pair<char, char>('A', 'C'));
myMap.insert(std::pair<char, char>('A', 'D'));
myMap.insert(std::pair<char, char>('B', 'C'));
// ... etc
假设您确实正在检查字符,而A
,B
,C
等并不代表其他内容。如果它们是替身,请根据需要进行调整。
然后,您可以在多重映射中查询键'A'下的所有值,如下所示:
typedef std::multimap<char, char>::iterator mmIter; // For brevity...
std::pair<mmIter, mmIter> iters = myMap.equal_range('A');
// Iterate over values for key
for (mmIter iter = iters.first ; iter != iters.second; ++iter)
{
// Print out value.
cout << " " << (*iter).second;
}
insert
将包含迭代器的pair
返回到与键匹配的第一个条目,并且紧跟在与键匹配的最后一个条目之后的条目。因此,这些可用于迭代条目,如图所示。
编辑2 刚刚意识到您的评论意味着什么。 Multimap本身不支持双向操作(即在值和键上查找),因此您可能需要维护两个多个映射 - 每个方向一个。这可能是一件痛苦的事情 - 确保两者保持正确同步可能很棘手。
或者,我确信有一些multimap.equal_range
课程可以达到目的(我实际上并不知道 - 我自己不使用Boost,但我相信其他人应该能够提供更多细节)。
答案 1 :(得分:2)
假设您必须使用左侧的“键”在右侧查找数据,我会使用多重映射来存储这些值。
另一种选择可能是std::map<keytype, std::vector<valuetype> >
。