三大概念:容器,迭代器,算法。模板是stl实现的基础。
迭代器连接起了容器和算法。
vecrtor相当于栈,都是在后插入,弹出,防止头插法后移元素,浪费时间。连续存储,但可以任意位置插入删除,使用迭代器可++,因为连续存储可以随机访问。扩充容量时,会把原来的数据删除,拷贝到更大容量的vector里面去。size()和capacity不相同,capacity容量更大。pushback pop时间复杂度为1,但插入删除,需要移动元素,时间复杂度高。
at()成员函数越界会抛出错误,[]不会,会直接崩,而一般有[]的就支持随机访问。
使用resize之后,元素个数减少,但是容量还是很大,为了释放多余容量,使用swap
vector<int> v;
v.pushback(1);
vector<int>(v).swap(v);//使用匿名对象,利用其用完就立马释放的原理
首先创建匿名对象vector<int>(v),其元素个数为v.size,容量也不大,接着将v与匿名对象互换,现在是匿名对象的capacity大,语句结束后v有了和元素个数相等的容量,就达到了节省内存的目的
reserve预先分配capacity可以防止多次创建新空间,防止不断拷贝复制,浪费时间。
reserve只是开辟空间,并没有元素,没有初始化,
resize改变容器大小,且创建对象,初始化
2. 函数对象
本身是对象,只是重载了(),可以做参数和返回值,for_each的返回值可以用对象来接受,第三个参数也可出入对象名,传入时候不是引用而是拷贝。