如何最有效地插入对列表?

时间:2011-06-06 22:52:38

标签: c++ containers

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

2 个答案:

答案 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

假设您确实正在检查字符,而ABC等并不代表其他内容。如果它们是替身,请根据需要进行调整。

然后,您可以在多重映射中查询键'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> >