标准模板库学习(3)----deque容器

序列容器

deque容器

deque容器又被称为双端队列、双端数组,它可以在其开始端进行数据的插入以及删除等操作。相比较于vector容器,deque在首段的数据的插入删除方面技高一筹,但是vector容器访问元素的速度比deque容器要快,不过二者的迭代器都是支持随机访问的,也就是说二者的迭代器时最强的那种迭代器。

deque构造函数

这一部分和vector容器所差无几,大家可以自己练一下

#include
using namespace std;
#include

void printDe(deque &d)
{
	for (deque::iterator de = d.begin(); de != d.end(); de++)
	{
		cout << *de << " ";
	}
	cout << endl;
}

void test01()
{
	dequed1;  //第一种
	for (int i = 0; i < 10; i++)
	{
		//d1.push_front(i);
		d1.push_back(i);
	}
	printDe(d1);

	dequed2(d1.begin(), d1.end());//第二种
	printDe(d2);

	dequed3(3, 20);//第三种
	printDe(d3);

	dequed4(d2);//第四种
	printDe(d4);
}

int main()
{
	test01();
}

deque赋值函数 

这一部分与vector几乎一模一样,仍然时assign和直接等号赋值即可。

#include
using namespace std;
#include

void printDe(deque& d)
{
	for (deque::iterator de = d.begin(); de != d.end(); de++)
	{
		cout << *de << " ";
	}
	cout << endl;
}

void test01()
{
	dequed1;  //定义一个deque容器d1,并添加数据到里面
	for (int i = 0; i < 10; i++)
	{
		//d1.push_front(i);
		d1.push_back(i);
	}
	printDe(d1);

	//赋值给d2
	dequed2;
	d2 = d1;
	printDe(d2);

	//赋值给d3
	dequed3;
	d3.assign(d1.begin(),d1.end());
	printDe(d3);

	//给d4赋10个200
	dequed4;
	d4.assign(10,200);
	printDe(d4);

}

int main()
{
	test01();
}

deque的大小操作

这里需要注意的是,deque容器没有容量的操作。

这是因为deque中有一个中控器,用来维护缓冲区的内容,而缓冲区存放的是真实的数据,中控器存放的则是缓冲区的地址,因此并没有容量的概念,只有大小。 其他操作与vector容器类似。

#include
using namespace std;
#include

void printDe(deque& d)
{
	for (deque::iterator de = d.begin(); de != d.end(); de++)
	{
		cout << *de << " ";
	}
	cout << endl;
}

void test01()
{
	dequed1;  //定义一个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位置的数据,返回下一个数据的位置

首先是尾端插入:

dequed1;  //定义一个deque容器d1,并添加数据到里面
	for (int i = 0; i < 10; i++)
	{
		//d1.push_front(i);
		d1.push_back(i);
	}

运行结果是

标准模板库学习(3)----deque容器_第1张图片

然后是首段插入:

dequed1;  //定义一个deque容器d1,并添加数据到里面
	for (int i = 0; i < 10; i++)
	{
		d1.push_front(i);
		//d1.push_back(i);
	}

 运行结果是:

 在以上基础上进行首端删除

d1.pop_front();
printDe(d1);

运行结果是:

 标准模板库学习(3)----deque容器_第2张图片

再进行尾端删除:

d1.pop_back();
printDe(d1);

运行结果是:

标准模板库学习(3)----deque容器_第3张图片

删除操作比较简单,接下来是插入操作,定义一个新的容器d2;

        dequed2;  //定义一个deque容器d2,并添加数据到里面
	for (int i = 10; i < 20; i++)
	{
		d1.push_back(i);
	}

 在固定位置插入数据,这里在首端插入数据30:

        d2.insert(d2.begin(),30);
	printDe(d2);

运行结果是:

标准模板库学习(3)----deque容器_第4张图片 

 在固定位置插入数据,这里在首端插入3个数40:

	d2.insert(d2.begin(),3, 40);
	printDe(d2);

运行结果是:

标准模板库学习(3)----deque容器_第5张图片 

这只是对首端进行操作,那怎么对随便的一个位置进行插入操作呢?这里需要指定一个迭代器后再进行插入操作:

	deque::iterator de2= d2.begin();
	de2++;
	d2.insert(de2, 4, 50);
	printDe(d2);

代码表示再首端之后的位置插入4个50,运行结果是:

标准模板库学习(3)----deque容器_第6张图片

下面对删除操作进行演示,以de3作为容器的首端,删除首端元素,第一个40应该是消失了的:

deque::iterator de3 = d2.begin();
	d2.erase(de3);

 运行结果如下:

标准模板库学习(3)----deque容器_第7张图片

接下来是进行区间数据的删除,表示删除首端之后的数据:

	deque::iterator de4 = d2.begin();
	d2.erase(++de4, d2.end());
	printDe(d2);

 运行结果如下:

 标准模板库学习(3)----deque容器_第8张图片

 最后一个是清空全部数据:

	d2.clear();
	printDe(d2);

运行结果只剩下一个换行符:

标准模板库学习(3)----deque容器_第9张图片

整体代码如下:

#include
using namespace std;
#include

void printDe(deque& d)
{
	for (deque::iterator de = d.begin(); de != d.end(); de++)
	{
		cout << *de << " ";
	}
	cout << endl;
}

void test01()
{
	dequed1;  //定义一个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()
{
	dequed2;  //定义一个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::iterator de2= d2.begin();
	de2++;
	d2.insert(de2, 4, 50);
	printDe(d2);

	deque::iterator de3 = d2.begin();
	d2.erase(de3);
	printDe(d2);

	deque::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;

 运行结果是:

标准模板库学习(3)----deque容器_第10张图片

deque排序

这里的排序操作使用到STL提供额sort算法,只需要讲容器需要排序的数据的区间放进去即可;

sort(iterator begin,iterator end);

下面来一个例子:

#include
using namespace std;
#include
#include

void printDe(deque& d)
{
	for (deque::iterator de = d.begin(); de != d.end(); de++)
	{
		cout << *de << " ";
	}
	cout << endl;
}

void test01()
{
	dequed;  //定义一个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();
}

这是一个很简单的例子,实现从小到大排序,运行结果如下:

标准模板库学习(3)----deque容器_第11张图片

一般来说支持随机访问迭代器的容器都可以使用sort进行排序,除此之外,sort(d.begin(), d.end()); 中的两个参数不要写反了,不是写反了就可以实现从大到小排序的,可以试一试,应该会出现以下的样子:

标准模板库学习(3)----deque容器_第12张图片

deque容器的介绍到此结束,大家觉的可以的话点个赞哦!谢谢!

你可能感兴趣的:(C++)