如何从一个映射键列表中减去另一个映射键列表并获取新映射(映射 A - mab B = 映射 C)
所以我有 2 个 std::map
s
一个是“旧”,一个是“新”我想获取哪些文件被删除,这样就能够迭代差异并对shared_ptr 做一些事情。这样的事情可能吗?如何做到?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
虽然自己编写这个代码很容易(迭代
A
并检查密钥是否存在于B
中),但这看起来像是std::set_difference 的工作
。不过,我们需要一个 lambda 或一些自定义谓词来比较键:如果您想自己编写这个,您应该考虑利用两个范围已经排序的事实,这样您就可以比平面搜索做得更好通过并行推进两个迭代器。
如果您没有 C++11,只需使用此谓词而不是 lambda:
注意映射类型上没有比较!因此,如果两个映射中具有相同的字符串键,那么结果中将不会有这样的项目,即使两个映射值不同。如果这是不可取的,则需要不同的输出容器(例如
std::multimap
)和不同的谓词。While it's easy enough to write this yourself (iterate over
A
and check if the key is present inB
), this looks like a job forstd::set_difference
. We'll need a lambda or some custom predicate to compare keys, though:If you want to write this yourself, you should consider taking advantage of the fact that both ranges are already sorted, so you can do better than a flat search for existence by advancing two iterators in parallel.
If you don't have C++11, just use this predicate instead of the lambda:
Beware that there is no comparison on the mapped type! So if you have the same string key in both maps, then there will be no such item in the result, even if the two mapped values differ. If this is undesirable, you need a different output container (e.g. a
std::multimap<my_map::key_type, my_map::mapped_type>
) and a different predicate.