微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 有效计算两个std :: multimap迭代器之间的条目数

我想在少于O(N)的时间内计算std :: multimap的两个迭代器之间的条目数.有没有任何技巧或聪明的方法来做到这一点?

由于std :: multimap具有双向迭代器,我的理解是像std :: distance这样的东西可以在O(N)时间内完成.

其他细节:multimap的键是N元组.我试图在多重映射中找到其键的第一个元素为0的条目数.它们键的第一个元素的选项是0和1,而multimap使用严格的弱排序,其中键的第一个元素永远是最重要的.即,所有带0的元素都来自任何带有1的元素.

上下文:迭代器由equal_range返回,它以对数时间运行.据说,我想测量范围的长度.

谢谢.

解决方法

您正在寻找的是在N3465中提出的所谓的 heterogeneous comparison lookup.它允许在用于存储密钥的equal_range成员函数中使用不同但兼容的比较函数.在您的情况下,查找比较运算符(第一个元组成员)将与元组词典比较不同但是一致.

不幸的是,根据this Q&A,该文件中只有一小部分被接受进入C 14标准草案.但是,N3465论文的作者也是已实施this feature的Boost.MultiIndex的作者.您可以通过关注Boost来emulate a std::multimap. MultiIndex文档.

一旦使用了改编的boost :: multiindex_container的通用equal_range成员函数,就可以在返回的迭代器上简单地执行std :: distance().对于equal_range的容器大小,复杂度将是对数,并且返回的迭代器范围的大小是线性的.如果您对结果不感兴趣但只对计数感兴趣,那么还有一个广义的count()成员函数在相同的对数线性时间内返回.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐