C++ STL vector & deque & queue & list & stack


STL

STL 组件主要包括容器,迭代器、算法和仿函数,容器即用来存储并管理某类对象的集合,迭代器用于在一个对象群集的元素上进行遍历动作。对象群集可能是容器,也可能是容器的一部分,算法用来处理群集内的元素,可以出于不同目的搜寻、排序、修改、使用那些元素。所有容器的迭代器都提供一致的接口,通过迭代器的协助,算法程序可以用于任意容器。STL中大量运用了仿函数。仿函数具有泛型编程强大的威力,是纯粹抽象概念的例证。
1.用法总结
2.顺序容器差异


顺序容器使用

(1)vector

#include <vector>
//初始化方法
 vector<int> vec1;    //默认初始化,vec1为空
 vector<int> vec2(vec1);  //使用vec1初始化vec2
 vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
 vector<int> vec4(10);    //10个值为0的元素
 vector<int> vec5(10,4);  //10个值为4的元素
 vector<string> vec6(10,"null");    //10个值为null的元素
 vector<string> vec7(10,"hello");  //10个值为hello的元素
 vector<int> vec8 = {1,2,3,4,5,6,7};//
 vector<int> vec9({1,2,3,4,5,6,7});//初始化

// 常用操作
vec1.push_back(100); //在末尾添加元素
int size = vec1.size();//元素个数
bool isEmpty = vec1.empty();//判断是否为空
cout << vec1[0] <<endl;//首个元素
vec1.insert(vec1.end(), 5, 3);//从这个位置插入五个值为3的元素
vec1.pop_back();//删除末尾元素
vec1.erase(vec1.begin(), vec1.end());//删除之间的元素,其它元素前移
cout << (vec1 == vec2);//可以直接进行比较
vector<int>::iterator iter = vec.begin();//迭代器首地址
vector<int>::const_interator c_iter = vec1.begin();//const类型迭代器
sort(vec.begin(), vec.end());//正向排序,从小到大排序
sort(vec.rbegin(), vec.rend());//逆向排序,从大到小排序
find(vec.begin(), vec.end(), 1);//查询值为1的元素,返回所在的迭代器
vec1.clear();//清空元素

//遍历方法
//下标法(vector的特有访问方法,一般容器只能通过迭代器访问)
int  length = vec1.size();
for ( int  i=0;i<length;i++)
{
    cout<<vec1[i];
}
cout<<endl<<endl;
// 迭代器法:const vector<int>& 只能用const迭代器
vector< int >::const_iterator iterator = vec1.begin();
for (;iterator != vec1.end();iterator++)
{
    cout<<*iterator;
}

//反向遍历
for(auto iter = v.rbegin(); iter != v.rend(); iter++)
	cout<<*iter<<' ';

for(auto iter = v.end()-1; iter >= v.begin(); iter--)
	cout<<*iter<<' ';

(2)deque

#include <deque>
//deque和vector类似,支持随机访问和快速插入删除,不同的是,支持push_front()操作
//其它基本一致
deque<int> dq(3);
dq.push_front(5);//从最前面插入元素5

(3)list

#include <list>

//初始化方法
list<int> lst1;//默认初始化方法
list<int> lst2(3);//初始化有三个元素的list
list<int> lst3(3, 2);//初始化有三个元素值为2的list
list<int> lst4(lst2);//用已有的list初始化
list<int> lst5(lst2.begin(), lst2.end());//用迭代器初始化

//常用操作
lst1.push_back(10);
lst1.size();//大小
lst1.pop_back();//删除末尾元素
lst1.begin();
lst1.end();
lst1.clear();
bool isEmpty = lst1.empty();
lst1.erase(lst1.begin(), lst1.end()); //删除之间的元素
lst1.front();//第一个元素的引用
lst1.back();//最后一个元素的引用
lst1.rbegin();//第一个元素的前向指针
lst1.insert(lst1.begin(), 3, 2);
lst1.sort(); //排序
lst1.reverse();//将lst1中元素反转
lst1.unique(); //删除相邻重复元素

//遍历方法
//迭代器法
for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++)
{
     cout<<*iter;
}
cout<<endl;

(4)stack

参考博客

stack<int> q;	//以int型为例
int x;
q.push(x);		//将x压入栈顶
q.top();		//返回栈顶的元素
q.pop();		//删除栈顶的元素
q.size();		//返回栈中元素的个数
q.empty();		//检查栈是否为空,若为空返回true,否则返回false


(5)queue

#include<queue>
q.empty();               //如果队列为空返回true,否则返回false
q.size();                //返回队列中元素的个数
q.pop();                 //删除队列首元素但不返回其值
q.front();               //返回队首元素的值,但不删除该元素
q.push();                //在队尾压入新元素
q.back();                //返回队列尾元素的值,但不删除该元素

总结

  • vector:连续存储结构,每个元素在内存上是连续的;支持高效的随机访问(使用下标和at()方法访问)和在尾端插入/删除操作,但其他位置的插入/删除操作效率低下; 相当于一个数组,但是与数组的区别为:内存空间的扩展。vector支持不指定vector大小的存储,但是数组的扩展需要程序员自己写。

  • deque:连续存储结构,即其每个元素在内存上也是连续的,类似于vector,不同之处在于, deque提供了两级数组结构, 第一级完全类似于vector,代表实际容器;另一级维护容器的首位地址。这样,deque除了具有vector的所有功能外, 还支持高效的首/尾端插入/删除操作。

  • list:具有双链表结构,每个元素维护一对前向和后向指针,因此支持前向/后向遍历。 支持高效的随机插入/删除操作,但随机访问效率低下,且由于需要额外维护指针 ,开销也比较大。每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储,无法随机访问。

1)vector为存储的对象分配一块连续的地址空间 ,随机访问效率很高。但是 插入和删除需要移动大量的数据,效率较低。尤其当vector中存储
的对象较大,或者构造函数复杂,则在对现有的元素进行拷贝的时候会执行拷贝构造函数。
(2)list中的对象是离散的,随机访问需要遍历整个链表, 访问效率比vector低。但是在list中插入元素,尤其在首尾 插入,效率很高,只需要改变元素的指针。
(3)vector是单向的,而list是双向的;
(4)向量中的iterator在使用后就释放了,但是链表list不同,它的迭代器在使用后还可以继续用;链表特有的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值