接序章容器部分:https://blog.csdn.net/weixin_45728280/article/details/156484639?spm=1011.2415.3001.5331
3.3 deque
3.3.1 概念
双端数组,可以对头端进行插入删除操作。
deque VS vector(1)vector对于头部插入删除效率低,数据量越大、效率越低;
(2)deque相对而言对头部插入删除速度更快;
(3)vector访问元素时速度比deque快
3.3.2 构造函数
(1)deque<T> deqT; //默认构造函数
(2)deque(beg, end); //将[beg, end]区间的元素拷贝给本身
(3)deque(n, elem); //构造函数将n个elem拷贝给本身
(4)deque(const deque &deq); //拷贝构造函数
cpp#include <iostream> using namespace std; #include <deque> // deque构造函数 void printDeque(const deque<int>& d) { for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { deque<int> d1; //默认构造函数 for (int i = 0; i < 10; i++) { d1.push_back(i); } printDeque(d1); deque<int> d2(d1.begin(), d1.end()); //区间构造函数 printDeque(d2); deque<int> d3(10, 100); //填充构造函数 printDeque(d3); deque<int> d4(d3); //拷贝构造函数 printDeque(d4); } int main() { test01(); return 0; }
3.3.3 赋值操作
给deque容器进行赋值
(1)deuqe& operator=(const deque &deq); //重载等号操作符
(2)assign(beg, end); //将[beg, end)区间中数据拷贝赋值给本身
(3)assign(n, elem); //将n个elem拷贝赋值给本身
cpp#include <iostream> using namespace std; #include <deque> // deque赋值操作 void printDeque(const deque<int>& d) { for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { deque<int> d1; for (int i = 0; i < 10; i++) { d1.push_back(i); } printDeque(d1); // 赋值 deque<int> d2; d2 = d1; // operator= printDeque(d2); // assign deque<int> d3; d3.assign(d1.begin(), d1.end()); printDeque(d3); // n个相同元素 deque<int> d4; d4.assign(10, 100); printDeque(d4); } int main() { test01(); return 0; }
3.3.4 大小操作
对deque容器的容量和大小操作
(1)empty(); //判断容器是否为空
(2)size(); //返回容器中元素的个数
(3)resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置
//如果容器变短,则末尾超出容器长度的元素被删除
(4)resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem填充新 //位置;如果容器变短,则末尾超出容器长度的元素被删除
cpp#include <iostream> using namespace std; #include <deque> // deque大小操作 void printDeque(const deque<int>& d) { for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { deque<int> d1; for (int i = 0; i < 10; i++) { d1.push_back(i); } printDeque(d1); // 1.判断是否为空 if (d1.empty()) { cout << "d1为空" << endl; } else { cout << "d1不为空" << endl; cout << "d1的大小为:" << d1.size() << endl; } // 2.重新指定大小 d1.resize(15, 100); // 如果指定的大小比原来大,则用100填充新位置 printDeque(d1); d1.resize(5); // 如果指定的大小比原来小,则多余元素被删除 printDeque(d1); } int main() { test01(); return 0; }
3.3.5 插入和删除
两端插入:
(1)push_back(ele); //尾部插入元素ele
(2)push_front(ele); //头部插入元素ele
(3)pop_back(); //删除最后一个元素
(4)pop_front(); //删除第一个元素
指定位置操作:
(1)insert(pos, ele); //在pos位置插入元素ele,返回新数据位置
(2)insert(pos,n,ele); //在pos位置插入n个ele数据,无返回值
(3)clear(); //删除容器中所有元素
(4)erase(beg, end); //删除[beg,end)区间的数据,返回下一个数据位置
(5)erase(pos); //删除pos位置数据,返回下一个数据位置
cpp#include <iostream> using namespace std; #include <deque> // deque插入和删除 void printDeque(const deque<int>& d) { for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; } // 两端操作 void test01() { deque<int> d; // 尾插 d.push_back(10); d.push_back(20); d.push_back(30); printDeque(d); // 头插 d.push_front(100); d.push_front(200); d.push_front(300); printDeque(d); // 尾删 d.pop_back(); printDeque(d); // 头删 d.pop_front(); printDeque(d); } // void test02() { deque<int> d1; d1.push_back(10); d1.push_back(20); d1.push_back(30); printDeque(d1); // 插入 d1.insert(d1.begin(), 2, 100); printDeque(d1); // 删除 d1.erase(d1.begin()); printDeque(d1); // 清空 d1.clear(); printDeque(d1); } int main() { test01(); test02(); return 0; }
3.3.6 数据存取
cpp#include <iostream> using namespace std; #include <deque> // deque容器数据存取 void test01() { deque<int> d; d.push_back(10); d.push_back(20); d.push_back(30); d.push_front(100); d.push_front(200); d.push_front(300); //通过[]方式访问元素 for(int i = 0; i < d.size(); i++) { cout << d[i] << " "; } cout << endl; //通过at方式访问元素 for(int i = 0; i < d.size(); i++) { cout << d.at(i) << " "; } cout << endl; } int main() { test01(); return 0; }
3.3.7 排序操作
sort(iterator beg, iterator end) //对beg和end区间内元素进行排序
cpp#include <iostream> using namespace std; #include <deque> #include <algorithm> void printDeque(const deque<int>& d) { for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; } // deque容器排序 void test01() { deque<int> d; d.push_back(10); d.push_back(30); d.push_back(20); d.push_front(100); d.push_front(200); d.push_front(300); //300 200 100 10 30 20 printDeque(d); //排序, 默认是从小到大 sort(d.begin(), d.end()); cout << "排序后:" << endl; printDeque(d); } int main() { test01(); return 0; }
3.4 应用-评委打分
cpp#include <iostream> using namespace std; #include <vector> #include <deque> #include <algorithm> /*评委打分 有5名选手:ABCDE,10个评委分别对每一名选手打分,去除一个最高分和一个最低分,求每一名选手的平均分。 */ //定义选手类 class Person { public: string m_Name; //姓名 double m_Score; //平均分 }; void createPerson(vector<Person>& v) { string nameSeed = "ABCDE"; for (int i = 0; i < 5; i++) { Person p; p.m_Name = "选手"; p.m_Name += nameSeed[i]; p.m_Score = 0; v.push_back(p); } } 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; //60-100 d.push_back(score); } // cout << "选手:" << it->m_Name << " 打分:" << endl; // for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++) // { // cout << *dit << " "; // } cout << endl; //排序 sort(d.begin(), d.end()); //去除最高分和最低分 d.pop_front(); d.pop_back(); //计算平均分 int sum = 0; for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++) { sum += *dit; } it->m_Score = double(sum) / d.size(); } } void showScore(const vector<Person>& v) { for (vector<Person>::const_iterator it = v.begin(); it != v.end(); it++) { cout << "姓名:" << it->m_Name << " 平均分:" << it->m_Score << endl; } } int main() { //随机数种子 srand((unsigned int)time(NULL)); //1.创建5名选手对象 vector<Person> v; createPerson(v); // 测试 // for(vector<Person>::iterator it = v.begin(); it != v.end(); it++) // { // cout << "选手姓名:" << it->m_Name << " 分数:" << it->m_Score << endl; // } //2.给选手赋值 setScore(v); //3.显示结果 showScore(v); system("pause"); return 0; }
