序列容器
deque容器
deque容器又被称为双端队列、双端数组,它可以在其开始端进行数据的插入以及删除等操作。相比较于vector容器,deque在首段的数据的插入删除方面技高一筹,但是vector容器访问元素的速度比deque容器要快,不过二者的迭代器都是支持随机访问的,也就是说二者的迭代器时最强的那种迭代器。
deque构造函数
这一部分和vector容器所差无几,大家可以自己练一下
#include<iostream>
using namespace std;
#include<deque>
void printDe(deque<int> &d)
{
for (deque<int>::iterator de = d.begin(); de != d.end(); de++)
{
cout << *de << " ";
}
cout << endl;
}
void test01()
{
deque<int>d1; //第一种
for (int i = 0; i < 10; i++)
{
//d1.push_front(i);
d1.push_back(i);
}
printDe(d1);
deque<int>d2(d1.begin(), d1.end());//第二种
printDe(d2);
deque<int>d3(3, 20);//第三种
printDe(d3);
deque<int>d4(d2);//第四种
printDe(d4);
}
int main()
{
test01();
}
deque赋值函数
这一部分与vector几乎一模一样,仍然时assign和直接等号赋值即可。
#include<iostream>
using namespace std;
#include<deque>
void printDe(deque<int>& d)
{
for (deque<int>::iterator de = d.begin(); de != d.end(); de++)
{
cout << *de << " ";
}
cout << endl;
}
void test01()
{
deque<int>d1; //定义一个deque容器d1,并添加数据到里面
for (int i = 0; i < 10; i++)
{
//d1.push_front(i);
d1.push_back(i);
}
printDe(d1);
//赋值给d2
deque<int>d2;
d2 = d1;
printDe(d2);
//赋值给d3
deque<int>d3;
d3.assign(d1.begin(),d1.end());
printDe(d3);
//给d4赋10个200
deque<int>d4;
d4.assign(10,200);
printDe(d4);
}
int main()
{
test01();
}
deque的大小操作
这里需要注意的是,deque容器没有容量的操作。
这是因为deque中有一个中控器,用来维护缓冲区的内容,而缓冲区存放的是真实的数据,中控器存放的则是缓冲区的地址,因此并没有容量的概念,只有大小。 其他操作与vector容器类似。
#include<iostream>
using namespace std;
#include<deque>
void printDe(deque<int>& d)
{
for (deque<int>::iterator de = d.begin(); de != d.end(); de++)
{
cout << *de << " ";
}
cout << endl;
}
void test01()
{
deque<int>d1; //定义一个deque容器d1,并添加数据到里面
for (int i = 0; i < 10; i++)
{
//d1.push_front(i);
d1.push_back(i);
}
printDe(d1);
//开始进行大小操作
if (d1.empty())
{
cout << "空的容器" << endl;
}
else
{
cout << "容器大小是:" << d1.size() << endl;
d1.resize(20,6);
printDe(d1);
d1.resize(4);
printDe(d1);
}
}
int main()
{
test01();
}
deque的插入和删除
在vector容器章节中没有列出代码介绍容器的插入与删除,在这里会对其进行详细的介绍。首先要了解相关的接口函数:
push_back(i); //尾端插入一个数据
push_fornt(i); //首段插入一个数据
pop_back(); //删除尾端一个数据
pop_front(); //删除首端一个数据
insert(pos,i);//在pos位置插入元素i的拷贝,返回新数据的位置
insert(pos,n,i);//在pos位置插入元素n个数据i,无返回值
insert(pos, start, end);//在pos位置插入区间start到end之间的数据,无返回值
clear();//清空容器中的全部数据
erase(start,end);//清除区间start到end之间的数据,返回下一个数据的位置
erase(pos);//清除pos位置的数据,返回下一个数据的位置
首先是尾端插入:
deque<int>d1; //定义一个deque容器d1,并添加数据到里面
for (int i = 0; i < 10; i++)
{
//d1.push_front(i);
d1.push_back(i);
}
运行结果是
然后是首段插入:
deque<int>d1; //定义一个deque容器d1,并添加数据到里面
for (int i = 0; i < 10; i++)
{
d1.push_front(i);
//d1.push_back(i);
}
运行结果是:
在以上基础上进行首端删除:
d1.pop_front();
printDe(d1);
运行结果是:
再进行尾端删除:
d1.pop_back();
printDe(d1);
运行结果是:
删除操作比较简单,接下来是插入操作,定义一个新的容器d2;
deque<int>d2; //定义一个deque容器d2,并添加数据到里面
for (int i = 10; i < 20; i++)
{
d1.push_back(i);
}
在固定位置插入数据,这里在首端插入数据30:
d2.insert(d2.begin(),30);
printDe(d2);
运行结果是:
在固定位置插入数据,这里在首端插入3个数40:
d2.insert(d2.begin(),3, 40);
printDe(d2);
运行结果是:
这只是对首端进行操作,那怎么对随便的一个位置进行插入操作呢?这里需要指定一个迭代器后再进行插入操作:
deque<int>::iterator de2= d2.begin();
de2++;
d2.insert(de2, 4, 50);
printDe(d2);
代码表示再首端之后的位置插入4个50,运行结果是:
下面对删除操作进行演示,以de3作为容器的首端,删除首端元素,第一个40应该是消失了的:
deque<int>::iterator de3 = d2.begin();
d2.erase(de3);
运行结果如下:
接下来是进行区间数据的删除,表示删除首端之后的数据:
deque<int>::iterator de4 = d2.begin();
d2.erase(++de4, d2.end());
printDe(d2);
运行结果如下:
最后一个是清空全部数据:
d2.clear();
printDe(d2);
运行结果只剩下一个换行符:
整体代码如下:
#include<iostream>
using namespace std;
#include<deque>
void printDe(deque<int>& d)
{
for (deque<int>::iterator de = d.begin(); de != d.end(); de++)
{
cout << *de << " ";
}
cout << endl;
}
void test01()
{
deque<int>d1; //定义一个deque容器d1,并添加数据到里面
for (int i = 0; i < 10; i++)
{
d1.push_front(i);
//d1.push_back(i);
}
printDe(d1);
d1.pop_front();
printDe(d1);
d1.pop_back();
printDe(d1);
}
void test02()
{
deque<int>d2; //定义一个deque容器d2,并添加数据到里面
for (int i = 10; i < 20; i++)
{
d2.push_back(i);
}
printDe(d2);
d2.insert(d2.begin(),30);
printDe(d2);
d2.insert(d2.begin(),3, 40);
printDe(d2);
deque<int>::iterator de2= d2.begin();
de2++;
d2.insert(de2, 4, 50);
printDe(d2);
deque<int>::iterator de3 = d2.begin();
d2.erase(de3);
printDe(d2);
deque<int>::iterator de4 = d2.begin();
d2.erase(++de4, d2.end());
printDe(d2);
d2.clear();
printDe(d2);
}
int main()
{
//test01();
test02();
}
deque的数据存取
首先了解一下相关的接口函数:
at(int i);//返回第i个元素的值
容器名[i];//返回第i个元素的值
front();//返回第一个元素的值
back();//返回最后一个元素的值
来一个测试案例,首先来打印出来容器中的元素,之前我们用的迭代器来打印的,这次采用上面的接口函数来进行访问,一共有两种方式:
//第一种
for (int i = 0; i < d1.size(); i++)
{
cout << d1[i] << " ";
}
cout << endl;
//第二种
for (int i = 0; i < d1.size(); i++)
{
cout << d1.at(i) << " ";
}
cout << endl;
然后显示首尾两个元素:
cout << "第一个元素是:" << d1.front() << endl;
cout << "最后一个元素是:" << d1.back() << endl;
运行结果是:
deque排序
这里的排序操作使用到STL提供额sort算法,只需要讲容器需要排序的数据的区间放进去即可;
sort(iterator begin,iterator end);
下面来一个例子:
#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
void printDe(deque<int>& d)
{
for (deque<int>::iterator de = d.begin(); de != d.end(); de++)
{
cout << *de << " ";
}
cout << endl;
}
void test01()
{
deque<int>d; //定义一个deque容器d1,并添加无序数据到里面
d.push_back(3);
d.push_back(5);
d.push_back(33);
d.push_back(2);
d.push_back(6);
d.push_back(1);
printDe(d);
sort(d.begin(), d.end()); //从小到大排序
printDe(d);
}
int main()
{
test01();
}
这是一个很简单的例子,实现从小到大排序,运行结果如下:
一般来说支持随机访问迭代器的容器都可以使用sort进行排序,除此之外,sort(d.begin(), d.end()); 中的两个参数不要写反了,不是写反了就可以实现从大到小排序的,可以试一试,应该会出现以下的样子:
deque容器的介绍到此结束,大家觉的可以的话点个赞哦!谢谢!