您的位置:首页 > 编程语言 > C语言/C++

C++中STL的介绍和vector容器的介绍

2017-08-16 20:26 537 查看

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)

迭代器的说明

迭代器操作 说明

(1)所有迭代器

p++ 后置自增迭代器

++p 前置自增迭代器

(2)输入迭代器

*p 复引用迭代器,作为右值

p=p1 将一个迭代器赋给另一个迭代器

p==p1 比较迭代器的相等性

p!=p1 比较迭代器的不等性

(3)输出迭代器

*p 复引用迭代器,作为左值

p=p1 将一个迭代器赋给另一个迭代器

(4)正向迭代器

提供输入输出迭代器的所有功能

(5)双向迭代器

–p 前置自减迭代器

p– 后置自减迭代器

(6)随机迭代器

p+=i 将迭代器递增i位

p-=i 将迭代器递减i位

p+i 在p位加i位后的迭代器

p-i 在p位减i位后的迭代器

p[i] 返回p位元素偏离i位的元素引用

p < p1 如果迭代器p的位置在p1前,返回true,否则返回false

p<=p1 p的位置在p1的前面或同一位置时返回true,否则返回false

p>p1 如果迭代器p的位置在p1后,返回true,否则返回false

p>=p1 p的位置在p1的后面或同一位置时返回true,否则返回false

只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:

容器 支持的迭代器类别 容器 支持的迭代器类别 容器 支持的迭代器类别

vector 随机访问 deque 随机访问 list 双向

set 双向 multiset 双向 map 双向

multimap 双向 stack 不支持 queue 不支持

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 如果你需要高效的随即
4000
存取
,而不在乎插入和删除的效率,使用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

特别鸣谢~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ stl