天天看點

2.4 C++STL deque容器詳解

文章目錄

    • 2.4.1 引入
    • 2.4.2 代碼示例
    • 2.4.3 代碼運作結果
    • 2.4.4 具體案例
    • 總結

2.4.1 引入

deque容器類比vector容器來學習。

deque為雙向開口容器,見下圖。而對比vector容器作為單項開口容器,在頭部插入與删除的操作效率奇差。

2.4 C++STL deque容器詳解
常用API應用學習 deque容器常用API

原理機制這裡不深究,本章僅探讨如何使用deque。感興趣的同學可以自己搜尋,這裡放一張原理圖

2.4 C++STL 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 C++STL deque容器詳解

2.4.4 具體案例

2.4 C++STL deque容器詳解

去除最高最低分這裡用雙向開口容器顯然是高效的,代碼如下。

//建立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;
}
           

運作結果如下:

2.4 C++STL deque容器詳解

總結

  • 雖然deque容器不常用,但是由于其和vector容器用法比較相像,可以加深了解相關内容。
  • deque在去“頭”去“尾”的案列中有較高效率。
謝謝閱讀(〃’ ▽ '〃)如有纰漏歡迎指出,覺得還不錯就點個贊吧。

繼續閱讀