引言
STL(Standard Template Library),即标准模板库,是C++标准函数库中的一部分,其在标准函数库占的比重将近80%,其涵盖了常用的数据结构和算法,灵活运用STL库可以明显降低开发强度。对于初学者,要尽快学会使用STL库,在灵活使用的基础上再进一步了解其底层实现,受益匪浅。
本文先说说STL中的容器以及容器的操作。
1. 顺序容器
1.1 vector
vector的内部实现是用动态数组实现的,使用allocator类实现内存管理(包含分配、释放、自动回收等),程序员不用关心内存管理的问题。vector由于重载了[]运算符,因此可以使用下标法访问元素。
1.2 vector操作函数
例如 vector<int> v;
v.push_back(1) //将int型1添加到v中;
v.capacity() //获得v的容量,此时为1,
v.push_back(2);
v.capacity(); //为2,当在添加元素时,需要动态地重新分配容量,一般扩为原来的两倍,然后将原来的数据复制到新分配的内存中;
v.push_back(3);
v.push_back(4);
v.push_back(5); //此时,v的容量是8
v.reserver(100); //如果因为不停地重新分配内存而造成性能问题,则使用该函数设置容器的容量。
v.erase(1); //删除v中第一次出现的元素1,并将被删除元素之后的内容前移
注意:区分capacity()和size(),此时v的容量是8,但是size()是vector实际存储元素的多少,此时v.size()为5。
1.3 易错操作
例如:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> array1;
array1.push_back(1);
array1.push_back(3);
array1.push_back(3);
array1.push_back(4);
//删除array1里的所有3
for(vector<int>::iterator it=array1.begin();it!=array1.end();++it){
if(3==*it){
array1.erase(it);
--it; //重点来了,如果没有这一步,一定会迭代漏掉某一项,所以要将迭代器后退一步
}
}
return 0;
}