【问题标题】:C++ Find the number of elements in a range from an STL::multimapC++ 从 STL::multimap 中查找范围内的元素数
【发布时间】:2009-11-09 06:50:54
【问题描述】:

我有一个 STL::multimap,我用 equal_range 搜索它以返回一个上限和下限。我可以在不遍历所有元素并一一计数的情况下找到此范围内的元素数量吗?

#include <iostream>
#include <map>

using namespace std;

int main () {
    multimap<int,int> mm;
    pair<multimap<int, int>::iterator,multimap<int, int>::iterator> ret;
    multimap<int,int>::iterator retit;

    for (int n=0; n<100; n++) {
        mm.insert ( make_pair( rand()%10,rand()%1000) );
    }

    ret = mm.equal_range(5);

    int ct = 0;
    for (retit=ret.first; retit!=ret.second; ++retit) {
        cout << retit->second << endl;
            ct++;
    }
    cout << ct << endl;

    return 0;
}

【问题讨论】:

    标签: c++ iterator multimap


    【解决方案1】:

    使用std::distance 算法查找迭代器之间的距离。喜欢:

    int ct1 = std::distance(ret.first, ret.second);
    

    【讨论】:

    • 感谢您的快速回复!这会节省我的速度还是和我上面显示的一样?我在此页面底部显示:cplusplus.com/reference/std/iterator/distance 它可能会更快 O(1) 但我不确定这是否是“随机访问迭代器”。
    • 不,它不会为您节省任何时间。随机访问迭代器(例如向量迭代器)的时间是常数。但是由于 map 有一个双向迭代器,所以它的时间复杂度是线性的。
    • Multimap 迭代器是双向的,不是随机访问的。因此,std::distance 将需要以与您的代码类似的方式重复使用 operator++。
    【解决方案2】:

    如果您只想计算具有给定键的元素数量,请使用count

    int ct = mm.count(5);
    

    【讨论】:

    • 确实我也可以使用它,但它似乎与自己迭代它的速度相同(见本页底部):cplusplus.com/reference/stl/multimap/count我认为没有免费的午餐在此找到。
    • 与迭代相比,编写的代码肯定更少,而且更易于阅读。它也可能更快。多重映射可以实现为类似于向量映射的东西,因此 count() 会找到起点,然后查找计数,而无需遍历范围。当然,这取决于实现者,完全不能依赖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多