**
deque&list容器
**
vector,deque,list,array都是序列式容器。
序列式容器:
1.序列式容器的元素按严格线性排列
2.可按顺序访问它们的位置
3.只有一个前驱和后继
deque容器属性:
序列式容器,动态数组
双端队列
deque的底层实现是一个链式数组
初始化:
deque<int> dq;
deque<int> dq2(10);
deque<int> dq3(10,6);
deque<int> dq4={1,2,3,4,5,6,7,8,9,10,};
deque与vector一样可以有效的进行尾部数据的的增加和删除,但是deque另外增加了可以高效的在头部数据的增加与删除。
deque<int> dq4={1,2,3,4,5,6,7,8,9,10,};
dq4.push_front(3);//在头部插入数据3;
dq4.pop_front();//删除头部第一个元素;
和vector相比,由于deque的底层是由一些不连续的数组内存之间组成的,所以没有指针内存这么一说;
//deque容器没有下列的功能
void capcity()=delete; //不能获取内存空间
void reserve()=delete; //不能改变空间大小
void shrink_to_fit()=delete; //不能缩减空间大小
//无法将数据给C语言函数使用 //没有固定的数组指针
void data();
deque的特点
1.deque是双端队列数据结构,可以在队尾队头高效的增加或者删减数据,这是比vector有优势的地方。
2.deque内部采用分段连续的内存空间来存储元素,在插入新元素的时候可以随机重新增加一段新的空间并连接起来,因此虽然提供了随机访问操作,但访问速度相比之下要比vector要慢。
3.deque并没有data函数,因为deque的元素并不存放在数组中,不能兼容c语言。
4.deque没有固定的内存空间,固不提供capacity和reserve操作。
迭代器相关的函数
void begin(); // 将迭代器返回到开头(增长方向:begin -> end)
void end(); // 将迭代器返回到结尾
void rbegin(); // 返回反向迭代器以反向开始(增长方向:rbegin -> rend)
void rend(); //将反向迭代器返回到反向结束
void cbegin() //将const_iterator返回到开头 // *与begin类似,区别在于begin指向的值可以改变,cbegin指向的值不可改变*
void cend() //将const_iterator返回到开头末尾 void crbegin() //返回const_reverse_iterator以反向开始
void crend() //将const_reverse_iterator返回到反向结束
void swap() // 交换两个容器的内容
void emplace() // 在迭代器位置插入元素
void emplace_front() // 在首部添加一个元素
练习一下迭代器的使用:
deque<int>::iterator iter =dq.begin();
for(auto i=dq.begin();i!=dq.end();i++)//deque的迭代器不能用<>符号,只能用=,!=;
{
cout<<*i<<" ";
}
cout<<endl;
//反向迭代器
deque<int>::reverse_iterator riter=dq.rbegin();
for(auto i=dq.rbegin();i<dq.rend();i++)
{
cout<<*i<<" ";
}
cout<<endl;
//常量迭代器
deque<int>::const_iterator citer=dq.cbegin();
for(auto i=dq.cbegin();i<dq.cend();i++)
{
cout<<*i<<" ";
}
cout<<endl;
//常量反向迭代器
deque<int>::const_reverse_iterator criter=dq.crbegin();
for(auto i=crbegin();i<crend();i++)
{
cout<<*i<<" ";
}
cout<<endl;
list
容器属性
1.list是一个双向链表
2.序列式容器
3.list所占空间比较大。
初始化方式和dequ,vector一样。
特点
list和deque的元素在内存的组织方式不同,list以链表的方式保存。
list也可以在头部和尾部插入元素。
list可以高效的在中间插入元素而不需要移动元素。
list独有函数remove()可以移除和参数一致的元素。
list删除数据的时候会马上回收。
list在多线程的时候会比较安全。
相比vector新增的函数:
void push_front(); //从头部插入数据
void pop_front(); //从尾部插入数据
void push_back(); //从头部插入数据
void pop_back(); //从尾部插入数据
void insert(); //高效插入数据(多线程环境中相对比较安全)
void erase(); //高效的删除数据,内存会马上释放掉
void remove(); //删除元素值
void remove_if(); //通过特定条件删除数据
void unique(); //删除连续重复的数值
void sort(); //调用list内部的排序算法
void merge(); //归并两个有序链表
没有 at() 不能进行内部的随机访问,即不支持 [] 操作符和 at()
vector list deque之间的转换
vector<int> vr={1,2,3,4,5,6,7,8,9,10};
deque<int> de(vr.begin(),vr.end());
list<int> li(vr.begin(),vr.end());
总结
1.三个容器的特点,缺点,底层。
2.三个容器的差异,同上
3.几种迭代器的使用。
4,容器之间的转换。