C++ 有效计算两个std::multimap迭代器之间的条目数
我想计算C++ 有效计算两个std::multimap迭代器之间的条目数,c++,c++11,stl,time-complexity,multimap,C++,C++11,Stl,Time Complexity,Multimap,我想计算std::multimap的两个迭代器之间在不到O(N)个时间内的条目数。有什么诀窍或聪明的方法可以做到这一点吗 由于std::multimap有双向迭代器,我的理解是类似std::distance的东西可以在O(N)时间内完成 其他详细信息:multimap的键是一个N元组。我试图在multimap中查找其键的第一个元素为0的条目数。键的第一个元素的选项是0和1,multimap使用严格的弱顺序,其中键的第一个元素始终是最重要的。i、 例如,所有带0的元素位于带1的元素之前 上下文:迭
std::multimap
的两个迭代器之间在不到O(N)个时间内的条目数。有什么诀窍或聪明的方法可以做到这一点吗
由于std::multimap
有双向迭代器,我的理解是类似std::distance
的东西可以在O(N)时间内完成
其他详细信息:multimap
的键是一个N元组。我试图在multimap
中查找其键的第一个元素为0的条目数。键的第一个元素的选项是0和1,multimap
使用严格的弱顺序,其中键的第一个元素始终是最重要的。i、 例如,所有带0的元素位于带1的元素之前
上下文:迭代器由equal_range
返回,它以对数时间运行。声明性地,我想测量范围的长度
谢谢。您想使用迭代器库中的
std::distance
方法。参考号在。以下是主要参考资料:
自2014年3月25日起,说明内容如下:
template< class InputIt >
typename std::iterator_traits<InputIt>::difference_type
distance( InputIt first, InputIt last );
您正在寻找的是N3465中提出的所谓的。它允许在用于存储
键的相等范围
成员函数中使用不同但兼容的比较函数。在您的例子中,查找比较运算符(第一个元组成员)将不同于元组词典比较,但与元组词典比较一致
不幸的是,据统计,该文件中只有一小部分被纳入了C++14标准草案。然而,N3465论文的作者也是Boost.MultiIndex的作者,该文件已经实现。您可以按照Boost.MultiIndex文档进行操作
一旦使用了自适应的boost::multiindex_容器的广义equal_range
成员函数,就可以对返回的迭代器执行std::distance()
。对于equal_范围
,复杂性在容器大小上是对数的,在返回的迭代器范围大小上是线性的。如果您对结果不感兴趣,而只对计数感兴趣,那么还有一个广义的count()
成员函数在相同的对数+线性时间内返回该值。是否不可能有计数器?不是,但我不希望手动管理计数器,如果有另一种方法可以做到这一点,它是内置在STL中的,或者不需要单独的计数器。地图/集合不提供访问树traveral位的权限,这总是让我很恼火。同样的std::lower_bound(map_iter,map_iter,V)
也因为同样的原因效率低下。这里的距离是O(n),所以这无助于OP.RandomAccessIterator满足双向迭代器的要求,但反过来就不行了。它不会比O(n)更好。如果需要,我将删除答案。有趣的是,boost库使用boost::multiindex_容器改进了std::multimap
容器,而@cpluplusooaand boost传统上是许多当前标准库功能的实现地,并经过了严格使用测试(例如,智能指针、哈希表等)。因此,从例如书籍作为有效C++的指南,“熟悉Boost”。BTW,N365的好引用:“作者已经收到了一些报告,指出这一功能是单独使用BooS.MultEdple代替标准关联容器的原因”。我非常了解新标准库功能的Boost试验场。令人惊讶的是,多索引容器还没有成为标准的一部分(例如,自Boost 1.32.0以来就可用)。我2001年的Effective C++
似乎没有什么Boost材料。除了这一页之外,还有什么建议吗:关于Boost参考书?我目前正在使用wget
获取网站文档。快速回顾这一优秀的Boost参考资料:表明它是Boost网站文档的一个很好的替代品多索引材料的具体链接如下:。简短但很好的增强内容
include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v{ 3, 1, 4 };
auto distance = std::distance(v.begin(), v.end());
std::cout << distance << '\n';
}