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容器vector删除(erase),遍历等基本用法介绍及头文件
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- c++ STL库容器之向量vector
- C++STL之vector容器
- C++STL中vector容器的用法
- [C++]STL中vector容器 begin()与end()函数、front()与back()的用法
- C++STL中vector容器的用法
- vector容器类的使用[c++ stl]
- C++ - STL - 序列式容器 - vector
- STL容器——vector接口介绍
- 【C++】STL常用容器总结之三:向量vector
- C++STL中vector容器的用法
- [C++]STL容器Vector的内存释放
- vector容器类的使用[c++ stl]
- C++STL中vector容器 begin()与end()函数、front()与back()的用法
- C++ STL基本容器的使用(vector、list、deque、map、stack、queue)
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- C++STL中vector容器 begin()与end()函数、front()与back()的用法
- C++面试题:介绍一下STL,STL如何实现vector
- C++面试题:介绍一下STL,STL如何实现vector