【问题标题】:std::map more-than needed comparisionstd::map 超出需要的比较
【发布时间】:2013-03-12 19:15:19
【问题描述】:

我正在尝试 std::map(在 MinGW 和 MSVC2008 中),我使用了以下代码:

#include <map>
#include <string.h>
#include <iostream>
using namespace std;

class MapManager
{public:
    void insert(char* n){
        cout << "Inserting " <<  n << endl;
        m_map[n] = 0;}
    void get(char* n){
        cout << "Finding (" << n << ")" << endl;
        int x = m_map[n];}
    struct cmp_str{
       bool operator()(char const *a, char const *b){
           cout << "operator(" << a << " " << b << ")\n";
           return strcmp(a, b) < 0;}
    };
    std::map<char*,int,cmp_str> m_map;
};
int main(){
    MapManager m;
    m.insert("Abc"); m.insert("Xyz"); m.insert("123"); m.insert("987"); 
    m.get("Abc"); m.get("Xyz");
 }

结果如下:

Inserting Abc
Inserting Xyz
operator(Abc Xyz)
operator(Xyz Abc)
operator(Abc Xyz)
operator(Xyz Abc)
Inserting 123
operator(Abc 123)
operator(123 Abc)
operator(123 Abc)
operator(Abc 123)
Inserting 987
operator(Abc 987)
operator(123 987)
operator(987 123)
operator(987 Abc)
operator(987 Abc)
operator(Abc 987)
operator(123 987)
operator(987 123)
Finding (Abc)
operator(Abc Abc)
operator(123 Abc)
operator(Abc 123)
operator(987 Abc)
operator(Abc 987)
operator(Abc Abc)
Finding (Xyz)
operator(Abc Xyz)
operator(Xyz Abc)
operator(Xyz Xyz)
operator(Xyz Xyz)

奇怪的是Inserting Xyz 需要 4 次调用才能进行比较!

operator(Abc Xyz)
operator(Xyz Abc)
operator(Abc Xyz)
operator(Xyz Abc)

map 用于插入/查找条目的算法是什么?

【问题讨论】:

    标签: c++ performance map stl


    【解决方案1】:

    它依赖于实现,唯一的要求是 insertfind/[] 都必须是 O(log n)。* 通常它是在 @ 上的插入/搜索987654321@,可能不完全平衡。

    (注意std::map是一个模板,所有的实现细节都在头文件中,你可以细读...)


    * 对于这个用例,至少。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2012-10-20
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多