学习目标:
学习内容:
1. deque 容器
deque容器是两端数组,可以对头部和尾部进行插入删除操作。
deque容器与vecto容器r的区别:
- vector对用头部的插入和删除操作需要移动元素,效率低下;
- deque对于头部的插入和删除速度比vector快;
- vector访问元素的速度比deque快,这和两者内部实现有关;
1.1 deque 容器的构造函数
#include<iostream>
#include<deque>
using namespace std;
void printDeque(const deque<int>& deq)
{
for (deque<int>::const_iterator d1 = deq.begin(); d1 != deq.end(); d1++)
{
cout << *d1 << " ";
}
cout << endl;
}
void test()
{
deque<int>deq;
for (int i = 1; i < 11; i++)
{
deq.push_back(i);
}
cout << "默认构造: ";
printDeque(deq);
cout << "区间构造: ";
deque<int>deq1(deq.begin(), deq.end());
printDeque(deq1);
cout << "n个elem赋值: ";
deque<int>deq2(10, 1);
printDeque(deq2);
cout << "拷贝构造: ";
deque<int>deq3(deq2);
printDeque(deq3);
}
int main()
{
test();
system("pause");
return 0;
}
1.2 deque 容器的赋值操作
#include<iostream>
#include<deque>
using namespace std;
void printDeque(const deque<int>& deq)
{
for (deque<int>::const_iterator d1 = deq.begin(); d1 != deq.end(); d1++)
{
cout << *d1 << " ";
}
cout << endl;
}
void test()
{
deque<int>deq;
for (int i = 1; i < 11; i++)
{
deq.push_back(i);
}
cout << "默认构造: ";
printDeque(deq);
cout << "等号赋值: ";
deque<int>d1;
d1 = deq;
printDeque(d1);
cout << "assign 赋值:";
deque<int>d2;
d2.assign(deq.begin(), deq.end());
printDeque(d2);
cout << "assign之n个elem: ";
deque<int>d3;
d3.assign(10, 2);
printDeque(d3);
}
int main()
{
test();
system("pause");
return 0;
}
1.3 deque 容器的赋值操作
#include<iostream>
#include<deque>
using namespace std;
void printDeque(const deque<int>& deq)
{
for (deque<int>::const_iterator d1 = deq.begin(); d1 != deq.end(); d1++)
{
cout << *d1 << " ";
}
cout << endl;
}
void test()
{
deque<int>deq;
for (int i = 1; i < 11; i++)
{
deq.push_back(i);
}
cout << "默认构造: ";
printDeque(deq);
cout << "等号赋值: ";
deque<int>d1;
d1 = deq;
printDeque(d1);
cout << "assign 赋值:";
deque<int>d2;
d2.assign(deq.begin(), deq.end());
printDeque(d2);
cout << "assign之n个elem: ";
deque<int>d3;
d3.assign(10, 2);
printDeque(d3);
}
int main()
{
test();
system("pause");
return 0;
}
1.4 deque 容器的大小
#include<iostream>
#include<deque>
using namespace std;
void printDeque(const deque<int>& deq)
{
for (deque<int>::const_iterator d1 = deq.begin(); d1 != deq.end(); d1++)
{
cout << *d1 << " ";
}
cout << endl;
}
void test()
{
deque<int>deq;
for (int i = 1; i < 11; i++)
{
deq.push_back(i);
}
cout << "默认构造: ";
printDeque(deq);
if (deq.empty())
{
cout << "容器为空!!!" << endl;
}
else
{
cout << "容器不为空!!!" << endl;
}
cout << "deque容器的大小:";
cout << deq.size() << endl;
cout << "deque容器改变大小为:";
deq.resize(15,-1);
printDeque(deq);
}
int main()
{
test();
system("pause");
return 0;
}
1.5 deque 容器的插入和删除
#include<iostream>
#include<deque>
using namespace std;
void printDeque(const deque<int>& deq)
{
for (deque<int>::const_iterator d1 = deq.begin(); d1 != deq.end(); d1++)
{
cout << *d1 << " ";
}
cout << endl;
}
void test()
{
deque<int>deq;
//尾插
deq.push_back(10);
deq.push_back(20);
//头插
deq.push_front(100);
deq.push_front(200);
cout << "默认构造: ";
printDeque(deq);
//删除容器第一个元素
deq.pop_front();
cout << "头删: ";
printDeque(deq);
//删除容器最后一个元素
deq.pop_back();
cout << "尾删:";
printDeque(deq);
//插入元素
cout << "插入元素:";
deq.insert(deq.begin(), 99); //迭代器的位置
printDeque(deq);
}
int main()
{
test();
system("pause");
return 0;
}
1.6 deque 容器的数据存取
#include<iostream>
#include<deque>
using namespace std;
void printDeque(const deque<int>& deq)
{
for (deque<int>::const_iterator d1 = deq.begin(); d1 != deq.end(); d1++)
{
cout << *d1 << " ";
}
cout << endl;
}
void test()
{
deque<int>deq;
//尾插
deq.push_back(10);
deq.push_back(20);
//头插
deq.push_front(100);
deq.push_front(200);
cout << "默认构造: ";
printDeque(deq);
cout << "第二个元素: " << deq.at(1) << endl;
cout << "第三个元素: "<<deq[2] << endl;
cout << "第一个元素: " << deq.front() << endl;
cout << "最后一个元素: " << deq.back() << endl;
}
int main()
{
test();
system("pause");
return 0;
}
1.7 deque 容器sort
#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
void printDeque(const deque<int>& deq)
{
for (deque<int>::const_iterator d1 = deq.begin(); d1 != deq.end(); d1++)
{
cout << *d1 << " ";
}
cout << endl;
}
void test()
{
deque<int>deq;
//尾插
deq.push_back(10);
deq.push_back(20);
deq.push_back(15);
//头插
deq.push_front(100);
deq.push_front(200);
deq.push_front(150);
cout << "默认构造: ";
printDeque(deq);
//排序
sort(deq.begin(),deq.end());
cout << "排序之后:";
printDeque(deq);
}
int main()
{
test();
system("pause");
return 0;
}
1.8 案例应用----评委打分
//评委打分
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<algorithm>
#include<ctime>
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 Name = "ABCDE";
for (int i = 0; i < 5; i++)
{
string name = "选手";
name += Name[i];
int Score = 0;
Person p(name, Score);
/*cout << p.m_Name << " " << p.m_Score << endl;*/
v.push_back(p);
}
}
void setScore(vector<Person>&v)
{
deque<int>d;//设置分数
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)//每个选手打十次分数
{
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 id = d.begin(); id != d.end(); id++)
{
sum += (*id);
}
int avg = 0;
avg = sum / d.size();
(*it).m_Score = avg;
}
}
void showScore(vector<Person>& v)
{
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
{
cout << (*it).m_Name << " " << (*it).m_Score << endl;
}
}
int main()
{
srand((unsigned int)time(NULL));
vector<Person>v;
creatPerson(v);
setScore(v);
showScore(v);
system("pause");
return 0;
}