C++——deque容器

目录

1,基本概念

2,deque构造函数

3,赋值操作 

4,deque容器大小操作 

5,插入和删除 

6,deque数据存取

7, 排序操作

8,案例-评委打分


1,基本概念

deque: deuble ended queue;

功能:双端数组,可以对头端进行插入删除操作。

deuqe与vector区别:

vector对于头部的插入删除效率低,数据量越大,效率越低;

deque相对而言,对头部的插入删除速度比vector快;

vector访问元素时的速度会比deque快,这和两者内部实现有关。

 deque内部工作原理:

deque内部有个中控器,维护每段缓冲区的内容,缓冲区中存放真实数据;

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。

 deque容器的迭代器也是支持随机访问的。

2,deque构造函数

功能:deque容器构造;

函数原型:

deque<T> deqT;       //默认构造

deque(beg,end);      //构造函数将[beg,end)区间中的元素拷贝给本身

deque(n,elem);       //构造函数将n个elem拷贝给本身

deque(const deque & deq);    //拷贝构造函数

#include <iostream>
using namespace std;
#include <string>
#include <deque>

void printDeuqe(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;  增加const后*it不可以被修改
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int> d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeuqe(d1);

	deque<int> d2(d1.begin(), d1.end());
	printDeuqe(d2);

	deque<int> d3(5, 100);
	printDeuqe(d3);

	deque<int> d4(d3);
	printDeuqe(d4);
}

int main()
{
	test01();
	system("pause");
	return 0;
}

注意const关键字的影响。 

运行结果:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100
100 100 100 100 100
请按任意键继续. . .

3,赋值操作 

功能:给deque容器进行赋值;

函数原型:

deque& operator=(const deque& deq);    //重载等号操作符

assign(beg,end);       //将[beg,end)区间中的数据拷贝赋值给本身

assign(n,elem);      //将n个elem拷贝赋值给本身 

#include <iostream>
using namespace std;
#include <string>
#include <deque>

void printDeuqe(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;  增加const后*it不可以被修改
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int> d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeuqe(d1);

	deque<int> d2 = d1;
	printDeuqe(d2);

	deque<int> d3;
	d3.assign(d1.begin(), d1.end());
	printDeuqe(d3);

	deque<int> d4(10, 10);
	printDeuqe(d4);

}

int main()
{
	test01();
	system("pause");
	return 0;
}

4,deque容器大小操作 

功能:对deque容器的大小进行操作;

函数原型:

deque.empty();       // 判断容器是否为空

deque.size();        //返回容器中元素的个数

deque.resize(num);     //重新指定容器的长度为num,若容器变长,则默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除

deque.resize(num,elem);     //重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除

#include <iostream>
using namespace std;
#include <string>
#include <deque>

void printDeuqe(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;  增加const后*it不可以被修改
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int> d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	
	if (d1.empty())
	{
		cout << "容器为空" << endl;
	}
	else
	{
		cout << "容器不为空" << endl;
		cout << "容器的大小:" << d1.size() << endl;
	}

	//注意deque容器没有容量的概念
	//d1.resize(15);
	//d1.resize(15,100);
	d1.resize(5);
	printDeuqe(d1);

}

int main()
{
	test01();
	system("pause");
	return 0;
}

注意:deque容器没有容量的概念。

5,插入和删除 

功能:向deque容器中插入和删除数据;

函数原型:

两端插入操作

push_back(elem)      //尾部插入一个数据

push_front(elem)     //头部插入一个数据

pop_back(elem)      //尾部删除一个数据

pop_front(elem)     // 头部删除一个数据

指定位置操作:

insert(pos,elem)    //pos位置插入一个elem元素的拷贝,返回新数据的位置

insert(pos,n,elem)  //pos位置插入n个elem数据,无返回值

insert(pos,beg,end)  //在pos位置插入[beg,end)区间的数据,无返回值

clear()          //清空容器的所有数据

erase(beg,end)  //删除[beg,end)区间的数据,返回下一个数据的位置

erase(pos)        //删除pos位置的数据,返回下一个数据的位置

#include <iostream>
using namespace std;
#include <string>
#include <deque>

void printDeuqe(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;  增加const后*it不可以被修改
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int> d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_front(100);
	d1.push_front(200);

	printDeuqe(d1);

	d1.pop_back();
	d1.pop_front();
	printDeuqe(d1);

	d1.insert(d1.begin(), 300);
	printDeuqe(d1);

	d1.insert(d1.begin(), 2, 400);
	printDeuqe(d1);

	deque<int> d2;
	d2.insert(d2.begin(),d1.begin(), d1.end());
	printDeuqe(d2);

	d1.erase(d1.begin());
	printDeuqe(d1);

	//d1.erase(d1.begin(), d1.end());
	d1.clear();
	printDeuqe(d1);

}

int main()
{
	test01();
	system("pause");
	return 0;
}

6,deque数据存取

功能:对deque中的数据存取操作;

函数原型:

at(int idx);    //返回索引idx所指的数据

operator[idx];   //返回索引idx所致的数据

front();     //返回容器中第一个数据元素

back();   //返回容器中最后一个数据元素

#include <iostream>
using namespace std;
#include <string>
#include <deque>

void printDeuqe(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;  增加const后*it不可以被修改
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int> d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_front(100);
	d1.push_front(200);

	for (int i=0;i<4;i++)
	{
		//[]方式访问
		//cout << d1[i] << " ";
		//at方式访问
		cout << d1.at(i) << " ";
	}
	cout << endl;

	cout << "第一个元素:" << d1.front() << endl;
	cout << "最后一个元素:" << d1.back() << endl;
}

int main()
{
	test01();
	system("pause");
	return 0;
}

7, 排序操作

功能:利用算法实现对deque容器进行排序

函数原型:

sort(iterator beg, iterator end)   // 对beg和end区间内元素进行排序,默认为升序

#include <iostream>
using namespace std;
#include <string>
#include <deque>
#include <algorithm>

void printDeuqe(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;  增加const后*it不可以被修改
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int> d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);
	d1.push_front(100);
	d1.push_front(200);
	d1.push_front(300);

	printDeuqe(d1);

	sort(d1.begin(), d1.end());
	cout << "排序后:" << endl;
	printDeuqe(d1);
}

int main()
{
	test01();
	system("pause");
	return 0;
}

运行后:

300 200 100 10 20 30
排序后:
10 20 30 100 200 300
请按任意键继续. . .

注意:sort排序默认规则为从大到小,升序排列,对于支持随机访问的迭代器的容器,都可以用sort算法直接对其进行排序,vector容器也可以利用sort进行排序。

sort算法非常实用,需要包含algorithm头文件。

8,案例-评委打分

案例描述:选手ABCDE,10个评委分别对每一个选手打分,去除最高分和最低分,取平均分。

实现步骤:

1,创建五名选手,放到vector容器中;

2,遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分存到deque容器中;

3,sort算法对deque容器中分数排序,去除最高和最低分;

4,deque容器遍历一遍,累加总分;

5,获取平均分。

#include <iostream>
using namespace std;
#include <string>
#include <deque>
#include <vector>
#include <algorithm>

void printDeuqe(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;  增加const后*it不可以被修改
		cout << *it << " ";
	}
	cout << endl;
}

class Person
{
public:
	Person(string name, int score)
	{
		this->m_Name = name;
		this->m_Score = score;
	}

	string m_Name;
	int m_Score;

};

void creatPerson(vector<Person>& v)
{
	string nameseed = "ABCDE";

	for (int i = 0; i < 5; i++)
	{
		string name = "选手";
		name += nameseed[i];

		int score = 0;

		Person p(name, score);
		v.push_back(p);
	}
}

void printVector(vector<Person>& v)
{
	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "姓名:" << it->m_Name << "分数:" << it->m_Score << endl;
	}
}

void setScore(vector<Person>& v)
{
	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		deque<int> d;
		for (int i=0;i<10;i++)
		{
			int score = rand() % 41 + 60;
			d.push_back(score);
		}

		sort(d.begin(), d.end());
		d.pop_back();
		d.pop_front();

		int sum = 0;
		for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++)
		{
			sum += *dit;
		}

		int avg = sum / d.size();

		it->m_Score = avg;
	}
}

void test01()
{
	//随机数种子
	srand((unsigned int)time(NULL));

	vector<Person> v;
	creatPerson(v);
	//遍历vector中元素
	//printVector(v);

	//给选手打分
	setScore(v);

	//打印最终得分
	printVector(v);

}

int main()
{
	test01();
	system("pause");
	return 0;
}

以上案例中用到了vector容器和deque容器。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值