跟踪节点遍历调用std :: map :: find?

时间:2013-11-06 12:59:27

标签: c++ optimization map std

我在std :: map上执行了大量的查找,插入和删除操作。我正在考虑添加一些代码来优化速度,但我想收集一些有关当前工作负载的统计信息。具体来说,我想跟踪每次调用时有多少节点“查找”需要遍历,这样我才能保持正常运行。

我想如果我的地图中的大多数更改都发生在前面,那么在使用“找到”使用的树之前,我最好先搜索前N个条目。

2 个答案:

答案 0 :(得分:1)

Find必须使用map的compare函数比较元素,这样你就可以提供一个自定义比较函数来计算它被调用的次数,以便查看它在每次调用时所做的工作量(基本上是多少个节点)遍历)。

我没有看到在调用find()之前搜索前N个条目在这种情况下可能会有所帮助。迭代遍历映射中的条目只是按排序顺序遍历树,因此除了调用find()之外它不会更有效率,除非你的比较函数比检查相等性要贵得多。

示例代码:

#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
#include <vector>

using namespace std;

int main() {
    vector<int> v(100);
    iota(begin(v), end(v), 0);
    vector<pair<int, int>> vp(v.size());
    transform(begin(v), end(v), begin(vp), [](int i) { return make_pair(i, i); });

    int compareCount = 0;
    auto countingCompare = [&](int x, int y) { ++compareCount; return x < y; };
    map<int, int, decltype(countingCompare)> m(begin(vp), end(vp), countingCompare);
    cout << "Compares during construction: " << compareCount << "\n";
    compareCount = 0;
    auto pos = m.find(50);
    cout << "Compares during find(): " << compareCount << "\n";
}

答案 1 :(得分:0)

如果您的键/值结构可行,则值得考虑unordered_map(在C ++ 11或TR1中)作为替代方案。 std::map,作为一个平衡的树,在这个使用情况下不太可能表现良好,而且你搜索前N个的混合方法对我来说似乎很多工作而没有保证的收益。