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()成员函数在相同的对数线性时间内返回.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...