文章目錄
-
- 2.4.1 引入
- 2.4.2 代碼示例
- 2.4.3 代碼運作結果
- 2.4.4 具體案例
- 總結
2.4.1 引入
deque容器類比vector容器來學習。
deque為雙向開口容器,見下圖。而對比vector容器作為單項開口容器,在頭部插入與删除的操作效率奇差。

常用API應用學習 deque容器常用API
原理機制這裡不深究,本章僅探讨如何使用deque。感興趣的同學可以自己搜尋,這裡放一張原理圖
2.4.2 代碼示例
#include<iostream>
#include<deque>
using namespace std;
void printd(deque<int> &d)//列印函數(這裡不需要引用&)
{
//法一
/*for (int i = 0; i < d.size(); i++)
{
cout << d[i] << " ";
}
cout << endl;*/
//法二
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
cout << *it << " ";//取*資料類型對應deque<>類型
cout << endl;
}
//deque容器構造(初始化)
void text01()
{
deque<int> d1;
deque<int> d2(10, 2);
deque<int> d3(d2.begin(), d2.end());
deque<int> d4(d3);
printd(d1);
printd(d2);
printd(d3);
printd(d4);
}
//deque容器指派
void text02()
{
deque<int> d1;
deque<int> d2;
deque<int> d3;
d1.assign(10, 5);
d2.assign(d1.begin(), d1.end());//疊代器指定區間指派
d3 = d2;//等号指派
d1.swap(d2);//交換
if (d1.empty())
{
cout << "空" << endl;
}
else
{
cout << "size:" << d1.size() << endl;
}
d1.resize(5);//這裡扔掉後五個元素
printd(d1);
}
//deque容器插入删除
void text03()
{
deque<int> d1;
d1.push_back(100);
d1.push_front(200);
d1.push_back(300);
d1.push_front(400);
printd(d1);
int val = d1.front();//拿到被删除的元素
d1.pop_front();//删除(無傳回值)
val = d1.back();
d1.pop_back();
printd(d1);
}
int main()
{
cout << "\ntext01:\n";
text01();
cout << "\ntext02:\n";
text02();
cout << "\ntext03:\n";
text03();
return 0;
}
2.4.3 代碼運作結果
2.4.4 具體案例
去除最高最低分這裡用雙向開口容器顯然是高效的,代碼如下。
//建立5個選手,姓名得分,評委為其打分
#include<iostream>
#include<vector>
#include<string>
#include<deque>
#include<algorithm>
using namespace std;
class Player
{
public:
Player():name("no_name"),score(0) {}
Player(string name_,int score_):name(name_),score(score_){}
public:
string name;
int score;
};
//建立選手
void greate_play(vector<Player> &v)
{
string nameSeed = "ABCDE";
for (int i = 0; i < nameSeed.size(); i++)
{
Player p;
p.name = "選手";
p.name += nameSeed[i];
p.score = 0;
v.push_back(p);
}
}
//打分
void setScore(vector<Player> &v)
{
//打分
for (vector<Player>::iterator it = v.begin(); it != v.end(); it++)
{
deque<int> dscore;
for (int i = 0; i < 10; i++)
{
int score = rand() % 41 + 60;//60~100分
dscore.push_back(score);
}
//排序
sort(dscore.begin(), dscore.end());
//去掉最高分最低分
dscore.pop_front();
dscore.pop_back();
//求平均分
int totalScore = 0;
for (deque<int>::iterator dit = dscore.begin(); dit != dscore.end(); dit++)
{
totalScore += *dit;
}
int average = totalScore / dscore.size();
//儲存分數
(*it).score = average;
}
}
bool cmp(Player a, Player b)
{
return a.score > b.score;
}
//排名
void printRank(vector<Player>& v)
{
sort(v.begin(), v.end(), cmp);
//列印
for (auto it = v.begin(); it != v.end(); it++)
{
cout << "name:" << (*it).name << "\t" << "score:" << (*it).score << endl;
}
}
int main()
{
//定義vector
vector<Player> p;
greate_play(p);
setScore(p);
printRank(p);
return 0;
}
運作結果如下:
總結
- 雖然deque容器不常用,但是由于其和vector容器用法比較相像,可以加深了解相關内容。
- deque在去“頭”去“尾”的案列中有較高效率。
謝謝閱讀(〃’ ▽ '〃)如有纰漏歡迎指出,覺得還不錯就點個贊吧。