Browsed by
Tag: hash

标准C/C++中的map

标准C/C++中的map

总体来说,map设计得很不错,很方便使用,但是其中有些操作,让人觉得十分鸡肋,不吐不快。

例如,对于最简单的查询操作,map在查询不到结果的情况下,居然直接插入一个默认值。这种做法十分多余,而且危险:

(1)接口不明确。查询就是查询,插入就是插入。现在居然在查询接口中,内含一个插入操作,接口设计的原子性不好,不够简单,逼迫使用者去作多余的思考。

(2)缺省值无法保证。例如,对于整数值,该接口认为0是缺省值。而在实际应用中,未必都会将0作为缺省值。在应用程序内埋下了地雷,搞乱甚至摧毁程序。

(3)频繁查询不存在的记录,会导致内存不断增加。这对于server类程序来说,简直要命。

即使是如此简单的、标准的数据结构操作,都可能引来如此众多的问题。对于常用的这些结构,如果不是特别强调效率或者通用性,实在是有必要定义自己的实现方式,尤其对于server端开发而言,使用标准C++库或者第三方库都应当非常慎重。

比较而言,QT中的QHash/QMultiHash设计得更为精良一些。

下面是测试代码:

#include <iostream>
#include <map>
#include <string>

using namespace std;

void test()
{
    map<string,int> demo1;
    cout<<"map size="<<demo1.size()<<endl;
    int j=demo1["1234"];
    cout<<"map size="<<demo1.size()<<endl;
}

int main(int argc, char *argv[])
{
    test();
    return 0;
}

测试结果如下:

map size=0

map size=1