ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-26 09:14:35  阅读:155  来源: 互联网

标签:c containers


我有

(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

我使用哪个容器?

我需要能够在容器的左手侧和右手侧查找数据,即通过键值.所以我需要能够搜索/查找

A,B,C,D in

A->B,C
B->C,D
C->D
D->E

和B,C in

A->B,C

解决方法:

std::multimap浮现在脑海中……基本上是地图,但允许在地图键中重复(即你可以有多个“A”键,每个键映射到“B”,“C”或“D”键,继续你的例).

编辑:回应Chris的评论:你以与地图相同的方式将项目插入到多图中 – 你创建一个包含键和值的std :: pair对象,然后将insert插入到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;
}

multimap.equal_range将包含迭代器的对返回到与键匹配的第一个条目,并且紧跟在与该键匹配的最后一个条目之后的条目.因此,如所示,这些可用于迭代条目.

编辑2刚刚意识到你的评论意味着什么. Multimap本身不支持双向操作(即在值和键上查找),因此您可能需要维护两个多图 – 每个方向一个.这可能是一件痛苦的事情 – 确保两者保持正确同步可能很棘手.

或者,我确定有一些Boost课程可以达到目的(我实际上并不知道 – 我自己不使用Boost,但我相信其他人应该能够提供更多细节).

标签:c,containers
来源: https://codeday.me/bug/20190726/1542787.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有