标准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