c++ 工程基础之STL系列 (一) vector

来源:互联网 发布:阿里云 青岛 编辑:程序博客网 时间:2024/04/29 14:15

STL在c++实际工程中很重要,可以提供开发效率降低维护成本,实际开发中可能大家并不需要了解其内部实现,但了解大概的数据结构还是有好处的。

首先讲下几个在工程中STL的几个典型问题: 1.判断容器为不为空empty() 复杂度是O(1),  而用size() == 0可能是O(N);

2.clear()并不能释放内存,用swap空容器释放

3.局部容器在跳出作用域将自动释放容器内存

4.new 出来的容器,在delete的时候自动释放容器

5.最好不要定义全局的容器,可以通过先定义全局指针,再new的方式

6.容器类的元素最好不要使用指针,因为这样很多时候忘记释放指针指向的内存,很容易造成内存泄露


STL的使用其实很简单,首先讲下STL最常用的容器类vector, 其实就是一个动态数组类,在工程中应用最广泛了一种了

#include<iostream>
#include<vector>
using namespace std;

#include<iostream>#include<vector>using namespace std;int main(){vector<int> v1;cout<<"v1.size = "<<v1.size()<<endl;cout<<"v1 capacity=" << v1.capacity()<<endl;//预留一定长度的数组,防止数组动态增长带来的来回分配内存和拷贝的开销//实际工程中很多时候要先预估下数据最大长度的可能值v1.reserve(6);cout<<"v1.size = "<<v1.size()<<endl;cout<<"v1 capacity=" << v1.capacity()<<endl;//相当于静态数组v1.resize(8);cout<<"v1.size = "<<v1.size()<<endl;cout<<"v1 capacity=" << v1.capacity()<<endl;//clear 并不能释放vector的内存v1.clear();cout<<"v1.size = "<<v1.size()<<endl;cout<<"v1 capacity=" << v1.capacity()<<endl;//swap 交换一个空的vector可以释放内存vector<int>(v1).swap(v1);cout<<"v1 capacity=" << v1.capacity()<<endl;vector<int> b;for(unsigned int i = 0; i < 10; i++){b.push_back(i);cout<<b.capacity()<<endl;}cout<<b.front()<<' '<<b.back()<<endl;b.pop_back();cout<<b.back()<<endl;//插入元素//等价于push_backvector<int>::iterator it = b.end();cout<<*b.insert(it, 100)<<endl;//等价于push_frontit = b.begin();cout<<*b.insert(it, 123)<<endl;//删除整个vectorfor(vector<int>::iterator it = b.begin(); it != b.end();){it = b.erase(it);}if(!b.empty()) cout<<"yes"<<endl;}