STL程序设计实践一:谨慎使用下标运算符
STL中容器占据很重要的地位,部分容器支持像数组一样的下标运算符,使其能向数组一样方便的访问,但也存在同样的限制,如向量和双端队列。所以在应用中要小心使用。举例说明:
vector<int> nvec(10,7); //定义元素都为7大小为10的整形向量
int n = nvec[0]; //获取向量的第一个元素
deque<int> ndeq(1,0); //定义一个整形双端队列
ndeq[0]=7; //修改元素
ndeq[1]=8; //添加元素
int ni = ndeq[1]; //访问双端队列的第二个元素
ni = ndeq[2]; //访问双端队列的第三个元素
这段代码编译时没有问题。但是很明显ni最后的值就象数组一样是不确定的,这样不出错是因为STL中容器的内存分配是动态的,它在需要时一次分配了最小的分配单元,在WINDOWS下为4K(这和操作系统有关系),但是如果下标值过大运行时就出非法访问的错误。这是因为越界访问造成的,所以在应用中一定要注意检查是否越界。
STL中映像容器同样支持下标操作,但有着和向量、双端队列不同之处。
map<int,int> d;
d[1]=9;
cout <<d.size()<<endl; //输出为1
int dd= d[2];
cout <<d.size()<<endl; //输出为2
这表示当你用下标操作访问映像时,如果要访问的对象不存在则映像就添加该元素,但其存储对象的值和实现有关。所以应用中不小心出现了此种情况时,很可能导致出现想不到的错误。
文章写的仓促,有错别字或错误请大家多批评指出。谢谢大家的捧场,在下感激不尽,欢迎和大家交流 (----袁凯----)。