Go Map v.s. C++ STL Map

Go的map是built-in的;C++的则是一个class template。Go FAQ里解释把map和string做成built-in的原因是一样的:

they are such a powerful and important data structure that providing one excellent implementation with syntactic support makes programming more pleasant. 

除此之外,在用法上,Go map和C++ STL map有很多相似的地方。但是也有不尽相同之初:

Initialization
Go map可以用Go的compound initialization语法来初始化,比如:

var timeZone = map[string] int {
    "UTC":  0*60*60,
    "EST": -5*60*60,
    "CST": -6*60*60,
    "MST": -7*60*60,
    "PST": -8*60*60,
}

C++ map不是built-in type,所以不能这样初始化。

Insertion
两者都用赋值来初始化:

timeZone["BJtime"] = 8*60*60

Fetch
两者都用同样的语法来取值:

entry = timeZone["BJtime"]

如果timeZone里没有"BJtime"这一项,entry是zero value;否则entry是这一项对应的值。

但是不同的是:如果timeZone["BJtime"]这项不存在,上面赋值代码在C++中会在map里插入一项(看看STL的源码就会发现,stl::map::operator[]会调用stl::map::_insert);而在Go中则对timeZone没有影响。

Test Presence
C++ map有一个专门的method:stl::map::find,来检查一个key是否存在。Go map用一个multiple assignment来检查:

entry, present = timeZone["BJtime"]

或者

_, present = timeZone["BJtime"]

上面两种情况下,present都是一个bool value,标志"BJtime"这项是否存在于timeZone中。

Deletion
Go map用一种特殊的multiple assignment来删除map中的一项:

timeZone["BJtime"] = 100, false

被赋予的第一个值是什么无所谓,但是第二个值必须是false。

C++ map需要调用专门的一个method:stl::map::erase,来删除map中的一项。