Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有效计算两个std::multimap迭代器之间的条目数_C++_C++11_Stl_Time Complexity_Multimap - Fatal编程技术网

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';
}