1 STL(Standard Template Library)
1. 1什么是STL?
STL(Standard Template Library),即标准模板库,是一种高效的C++程序库,它被容纳于C++标准程序库(C++ Standard Library)中。
1.2 STL的特点
STL的一个重要特点是数据结构和算法的分离。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;
STL是基于模板,这正好是使得STL的组件具有广泛通用性的底层特征。
1.3 STL内容介绍
1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;(简单说,就是用容器的迭代器输出数据)
STL中的容器有序列容器和关联容器:
(1)序列式容器(Sequence containers),也称顺序容器。每个元素都有固定位置--取决于插入时机和地点,和元素值无关,vector、deque、list;
(2)关联式容器(Associated containers),元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap;
2)迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。
用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
迭代器的作用:能够让迭代器与算法不干扰的相互发展,用以操作复杂的数据结构,容器提供迭代器,算法使用迭代器;
声明:每种容器类型都定义了自己的迭代器类型,如vector:
vector< int> :: iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector< int>定义的iterator类型。(区别容器和迭代器的关键符就是::)
3)算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。
4)仿函数(Function object)
5)迭代适配器(Adaptor)
6)空间配制器(allocator)
2 vector 容器
2.1 vector的定义
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组;当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.
用法:
1. 文件包含: 首先在程序开头处加上#include以包含所需要的类文件vector,还有一定要加上using namespace std;
2.变量声明:
1)声明一个int向量以替代一维的数组:vector < int> a;//(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。
2)用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即: vector < int * > a.同理想用向量代替三维数组也是一样, vector < int **> a;
例:
vector vec1;//无参
vector vec2(5);//生产5个参数,默认初始化为0
vector vec3(5,43);
2.2 vector的迭代器的使用
vector< int> ::iterator ite1=vec3.begin();
vector< int> ::iterator ite2=vec3.end();
vector< int> vec4(ite1,ite2);
2.3 vector的迭代器的容量
vector的扩容问题:
vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间中的元素被复制到新存储空间里, 接着插入新元素,最后撤销旧的存储空间。
分配的空间大小:初始空间+floor(初始空间/2)
size (): 指容器当前拥有的元素个数,
capacity(): 则指容器在必须分配新存储空间之前可以存储的元素总数。
例子:
void STLCapacity()
{
vector vec(5);
cout << vec.capacity()<< endl;//5+floor(5/2)
vec.push_back(1);
cout<< vec.capacity()<< endl;//7
vec.push_back(1);
cout<< vec.capacity()<< endl;
vec.push_back(1);
cout<< vec.capacity()<< endl;
vec.push_back(1);//7+3=10
cout<< vec.capacity()<< endl;
vec.push_back(1);
cout<< vec.capacity()<< endl;
vec.push_back(1);//10+5
cout<< vec.capacity()<< endl;
}
vector和list扩容的区别:
vector是顺序表,表示的是一块连续的内存,元素被顺序存储;list是双向连接表,在内存中不一定连续。
当数值内存不够时,vector会重新申请一块足够大的连续内存(x+x/2),把原来的数据拷贝到新的内存里面;list因为不用考虑内存的连续,设置多大就是多大。
vector ,list,deque 使用的区别:
1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque
2.3 vector的函数调用
详细的函数实现功能:其中vector< int> c.
c.clear() 移除容器中所有数据,删除所有数据
c.empty() 判断容器是否为空。
c.erase(pos) 删除pos位置的数据,删除一个数据
c.erase(beg,end) 删除[beg,end)区间的数据
c.front() 传回第一个数据。
c.insert(pos,elem) 在pos位置插入一个elem拷贝(前面位置,后面值)
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.resize(num) 重新设置该容器的大小
c.size() 回容器中实际数据的个数。(实际个数)
c.begin() 返回指向容器第一个元素的迭代器
c.end() 返回指向容器最后一个元素的迭代器
c.rbegin() 将vector反转后的开始指针返回(其实就是原来的end-1)
c.rend() 将vector反转构的结束指针返回(其实就是原来的begin-1)
c.empty()
c.swap()
注意:
1、 c.clear() 和 c.erase(pos) ;前者删除全部数据,后者删除特定数据
2、 c.insert(pos,elem) 在pos位置插入一个elem拷贝(前面位置,后面值)
3、 c.end() 注意, end() 函数返回一个指向当前vector末尾元素的下一位置的迭代器.注意,如果你要访问末尾元素,需要先将此迭代器自减1.。
4、swap函数可以用于容器见的赋值,如:a.swap(b)//把b容器的值赋值给a。
参考链接:
http://blog.csdn.net/piaoxuezhong/article/details/54348787
http://blog.csdn.net/hancunai0017/article/details/7032383
特别鸣谢~