Browsed by
标签:Map

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

VC 2008 Express编译QT程序时产生MAP文件

VC 2008 Express编译QT程序时产生MAP文件

MAP文件对于定位程序crash问题非常有用,一般情况下,我们总是希望能产生MAP文件以便将来出问题时好进行查找。

在VC 2008 Express中生成MAP文件比较简单,只需要修改工程属性中的link相关项即可。

可是在QT应用中,如何设置呢?这种情况下,是先使用qmake编译pro文件,然后使用VC的命令行方式编译程序,没有相应的VC工程进行设置。

我们可以修改QT在VC2008环境下的全局编译、链接开关。以QT4.6.2为例,假设qt安装在d:/qt/4.6.2目录下。

进入qt安装目录下的子目录: mkspecs\win32-msvc2008

用notepad打开该目录下的qmake.conf文件,找到QMAKE_LFLAGS项,将其修改为:

QMAKE_LFLAGS            = /NOLOGO /MAP /MAPINFO:EXPORTS

注意,全部都是需要大写格式。

修改完成后,重新qmake各pro工程文件并编译,就会在生成exe/dll/lib的同时,生成map文件。

上述方法修改的是QT全局的qmake连接标志,编译任何工程都会产生map文件。在实际应用中,我们可能只是希望部分工程产生map文件,这种情况下可以修改工程的pro文件,单独添加QMAKE_LFLAGS即可:

QMAKE_LFLAGS         += /MAP /MAPINFO:EXPORTS

Hadoop

Hadoop

前段时间看了本P2P的书,介绍了一堆云里雾里的知识。说实话,没怎么看懂。

在CSDN上看到一篇关于Hadoop的blog,很有意思。以前也粗略看过google的MapReduce文章,毫无疑问,Hadoop是个非常好的实现方案。以Hadoop为切入点,可以对分布式计算有更多的了解。

参考blog:

http://blog.csdn.net/wengyupeng/archive/2009/12/27/5083881.aspx