2009年1月31日星期六

STL map的一些注意

STL map一些内部的机制如果不注意或不了解很容易造成困扰。
特别是取下标操作符data_type& operator[](const key_type& k)。在sgi的文档里清楚的写着:由于operator[]可能向map插入新元素,所以不能是const成员函数。而m[k]实际上相当于((((m.insert(value_type(k, data_type()))).first)).second。严格来说,这个成员函数不是必需的,只是为了简便使用。(也带来了一些困扰和开销)。
typedef map INT_MAP;
INT_MAP iMap;
iMap[3] = "three";

插入3时,先在iMap中查找主键为3的项,没发现,然后将一个新的对象插入iMap,键是3,值是一个空字符串,插入完成后,将字符串赋为"three"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。可以用以下方法来避免开销:
enumMap.insert(map :: value_type(3, "three"))

同样,以string tmp = iMap[3];的操作来获取一个键值的对应值也存在问题。只有当map中有这个键值才成立,否则自动插入一个实例,值为默认初始值。

没有评论: