成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

第十九章-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)專注于瀍河企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),成都商城網(wǎng)站開發(fā)。瀍河網(wǎng)站建設(shè)公司,為瀍河等地區(qū)提供建站服務(wù)。全流程按需求定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

一、STL概述

二、STL基本概念

三、STL六大組件

四、string(類)容器

1.string容器基本概念

2.string容器常用操作

五、vector(類模板)容器

1.vector的概述

2.vector的數(shù)據(jù)結(jié)構(gòu)

3..vector常用的API操作

六、deque容器

1.deque容器基本概念

2.deque容器實(shí)現(xiàn)原理

3.deque常用API

七、stack容器

1.stack容器的基本概念

2.stack常用API

八、queue容器

1.queue容器的基本概念

2.queue常用API

九、list容器

1.list容器的基本概念

2.list常用API

十、set/multiset容器

1.set/multiset容器的基本概念

2.set/multiset常用API

3.對(duì)組(pair)

十一、map/multimap容器

1.map/multimap容器的基本概念

2.map/multimap常用API

3.multimap案例


一、STL概述

STL(Standard Template Library標(biāo)準(zhǔn)模版庫(kù)),是惠普實(shí)驗(yàn)室開發(fā)的一系列軟件的統(tǒng)稱。

為了建立數(shù)據(jù)結(jié)構(gòu)和算法的一套標(biāo)準(zhǔn),降低它們之間的耦合關(guān)系,以提升各自的獨(dú)立性、彈性、交互操作性(相互合作性,interoprrability),誕生了ST

其實(shí)就是提高 代碼復(fù)用性,制造出可重復(fù)運(yùn)用的代碼,而不需要自己再去寫已經(jīng)存在的代碼。??

二、STL基本概念

STL從廣義上分為:容器(container)、算法(alhorithm)、迭代器(iterator)

【容器和算法之間通過(guò)迭代器進(jìn)行無(wú)縫連接,算法 其實(shí)是 通過(guò)迭代器 操作 容器數(shù)據(jù)】

  • STL主要出現(xiàn)在c++中,但在c++引入前該技術(shù)已經(jīng)存在很長(zhǎng)時(shí)間了。?
  • STL幾乎所有代碼都采用了 模板類 或者 模板函數(shù) 。這相比傳統(tǒng)的 由函數(shù)和類組成的庫(kù) 來(lái)說(shuō),提供了更好的 代碼重用機(jī)會(huì)。
  • 在c++標(biāo)準(zhǔn)程序庫(kù)中,隸屬于STL的占到了80%以上。
三、STL六大組件

容器、算法、迭代器、仿函數(shù)、適配器(配接器)、空間配置器

STL的一個(gè)重要特性是 將數(shù)據(jù)和操作分離,數(shù)據(jù)由 容器類別 加以管理,操作則由 特定算法 完成。?

1.容器:存放數(shù)據(jù)

2.算法:操作數(shù)據(jù)

算法分為 質(zhì)變算法 和 非質(zhì)變算法。

質(zhì)變算法:運(yùn)算過(guò)程中,會(huì)更改區(qū)間內(nèi)的元素內(nèi)容。例如拷貝、替換、刪除等等。

非質(zhì)變算法:運(yùn)算過(guò)程中,不會(huì)更改區(qū)間內(nèi)元素內(nèi)容。例如查找、計(jì)數(shù)、遍歷、尋找極值等。

3.迭代器:算法 只能借助迭代器 操作容器數(shù)據(jù)(容器和迭代器一一對(duì)應(yīng))。

4.仿函數(shù):為算法提供更多策略

eg:排序函數(shù)默認(rèn)是從小到大排序,用仿函數(shù)讓它可以從大到小排序,提供更多的策略。?

5.適配器(配接器):為算法提供更多參數(shù)的接口

eg:函數(shù)默認(rèn)是傳1個(gè)參數(shù),用適配器讓它可以傳2個(gè)參數(shù),這樣的

6.空間配置器:為算法和容器 動(dòng)態(tài)分配、管理空間

最常用的容器是 vector 和 lis t容器。?

四、string(類)容器 1.string容器基本概念

c字符串是 以空字符結(jié)尾的字符數(shù)組,不適合大程序開發(fā),所以c++標(biāo)準(zhǔn)庫(kù)定義了一種string類。

  • char*是一個(gè)指針,string是一個(gè)類;
  • string封裝了char*,管理這個(gè)字符串,是一個(gè)char型的容器;
  • string封裝了很多實(shí)用的成員方法:

?【查找find,拷貝copy,刪除delete,替換replace,插入insert】

  • 不用考慮內(nèi)存釋放和越界

?【string管理char*所分配的內(nèi)存,每一次string的復(fù)制、取值都由string類負(fù)責(zé)維護(hù),不用擔(dān)心復(fù)制越界和取值越界等 】

2.string容器常用操作

(以下都是函數(shù)定義。string&是返回值,調(diào)用的時(shí)候用的是函數(shù)名,也就是operator、assign這樣的,懂吧)

【不管什么容器,看到assign就是賦值,operator是運(yùn)算符重載】

【3.[ ]越界不會(huì)拋出異常,at方法會(huì)】

【5.find返回第一次出現(xiàn)位置,rfind返回最后一次出現(xiàn)位置,沒(méi)找到返回-1;沒(méi)傳pos默認(rèn)從頭開始找】

#include#include//string.h是c的頭文件,string是類的
using namespace std;

#include//input output manipulator:輸入輸出格式控制

void test1()
{
	string str;//1.1
	cout<< str<< endl;
	string str1("hello");//1.3
	cout<< str1<< endl;
	string str2(5, 'A');//1.4
	cout<< str2<< endl;
	string str3=str2;//1.2 拷貝構(gòu)造
	cout<< str3<< endl;

	string str4;
	str4 = "hello";//2.1
	cout<< str4<< endl;
	str4.assign("world");//2.4
	cout<< str4<< endl;
	str4 = "W";//2.3
	cout<< str4<< endl;
	str4.assign("hello",3);//2.5
	cout<< str4<< endl;

	string str5 = "hello";
	str4.assign(str5, 2, 2);//2.8
	cout<< str4<< endl;
}
void test2()
{
	//3.1+3.2
	string str1 = "hello";
	cout<< str1[1]<<" "<0)
		cout<< "大于"<< endl;
	else if (str1.compare(str2)< 0)
		cout<< "小于"<< endl;
	//>、=、<重載
	if (str1==str2)
		cout<< "相等"<< endl;
	else if (str1>str2)
		cout<< "大于"<< endl;
	else if (str1
五、vector(類模板)容器 1.vector的概述

vector和array的數(shù)據(jù)安排和操作方式非常相似,兩者的唯一差別在于空間運(yùn)用的靈活性。 array是靜態(tài)空間,vector隨元素的加入,內(nèi)部會(huì)自動(dòng)擴(kuò)充空間,以容納新元素。

v.begin():獲取容器的起始迭代器(指向第0個(gè)元素)

v.end()? ?:獲取容器的結(jié)束迭代器(指向最后一個(gè)元素的下一個(gè)位置)?

只能尾插尾出

2.vector的數(shù)據(jù)結(jié)構(gòu)

線性連續(xù)空間

一旦滿載,vector會(huì)開辟 現(xiàn)有空間容量?jī)杀洞笮〉目臻g(未雨綢繆機(jī)制),將原內(nèi)容復(fù)制到新空間內(nèi)

3..vector常用的API操作

#includeusing namespace std;
#includevoid test1()
{
	//類的類型是類,類模板的類型是<類型>vectorv1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);

	//遍歷該容器
	//定義一個(gè)迭代器iterator 保存起始迭代器
	vector::iterator it = v1.begin();
	for (; it != v1.end(); it++)
	{
		//*it==int
		cout<< *it<< " ";
	}
	cout<< endl;
}
void test2()
{
	vectorv1;
	//可以事先預(yù)留足夠空間,省的多次開辟
	v1.reserve(1000);//3.6
	cout<< "容量:"<::iterator it;

	int i = 0;
	int count = 0;

	for (i = 0; i< 1000; i++)
	{
		v1.push_back(i);
		if (it != v1.begin())//如果開辟空間,v1.begin指向新空間,迭代器仍指向舊空間,v1.begin和迭代器不相等??梢酝ㄟ^(guò)這個(gè)來(lái)判斷是否開辟了空間。 
		{
			count++;
			cout<< "第"<< count<< "次開辟空間容量:"<< v1.capacity()<< endl;
			it = v1.begin();
		}
	}
}
void printVectorInt(vector& v)
{
	vector::iterator it = v.begin();
	for (; it != v.end(); it++)
		cout<< *it<< " ";
	cout<< endl;
}
void test3()
{
	vectorv1(5,100);//1.3
	printVectorInt(v1);

	vectorv2(v1.begin(), v1.end());//1.2
	printVectorInt(v2);

	vectorv3;//1.1
	//v3=v2;       //2.3
	//v3.assign(v2.begin(),v2.end());    //2.1
	v3.assign(10, 10);
	printVectorInt(v3);

	v3.swap(v2);//2.4
	printVectorInt(v2);
	printVectorInt(v3);

	vectorv4;
	if (v4.empty())//3.2
	{
		cout<< "空"<< endl;
	}
	else
		cout<< "非空"<< endl;
	vectorv5(10,30);
	cout<< "容量:"<< v5.capacity()<< " 大?。?<< v5.size()<< endl;//3.5 3.1
	printVectorInt(v5);
	//v5.resize(15);//過(guò)大 補(bǔ)零 3.3
	v5.resize(15, 2);//過(guò)大 補(bǔ)二 3.4
	v5.resize(5);//過(guò)小 刪除多余
	printVectorInt(v5);
}
void test4()
{
	vectorv1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);//10 20 30 40 50

	cout<< "頭元素:"<< v1.front()<< " 尾元素:"<v1;
	v1.reserve(1000);
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	cout<< "容量:"<< v1.capacity()<< " 大小:"<< v1.size()<< endl;
	//resize只能修改大小,不能修改容量 
	//v1.resize(4);
	vector(v1).swap(v1);//vector(v1)為匿名對(duì)象,發(fā)生拷貝構(gòu)造,用舊對(duì)象v1給新對(duì)象賦值(只有size大小的被賦值過(guò)去了,而不是capacity大小),
	//和v1 swap后,v1指向匿名對(duì)象的size大小空間
	cout<< "容量:"<< v1.capacity()<< " 大?。?<< v1.size()<< endl;
}

void test6()
{
	vectorv1(5, 10);
	vectorv2(5, 100);
	vectorv3(5, 1000);

	//定義一個(gè)vector容器存放v1 V2 V3
	vector>v;
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);

	//遍歷
	vector>::iterator it = v.begin();
	for (; it != v.end(); it++)
	{
		//*it==vectorvector::iterator mit = (*it).begin();
		for (; mit != (*it).end(); mit++)
		{
			cout<< *mit<< " ";
		}
		cout<< endl;
	}
}

#include;
void test7()
{
	vectorv1;
	v1.push_back(20);
	v1.push_back(60);
	v1.push_back(50);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(10);
	printVectorInt(v1);

	//排序算法
	sort(v1.begin(), v1.end());
	printVectorInt(v1);
}

#includeclass Person
{
	friend bool comparePerson(Person ob1, Person ob2);
	friend void printVectorPerson(vector&v);
private:
	int num;
	string name;
	float score;
public:
	Person() {}
	Person(int num, string name, float score)
	{
		this->num = num;
		this->name = name;
		this->score = score;
	}
};

void printVectorPerson(vector&v)
{
	vector::iterator it = v.begin();
	for (; it != v.end(); it++)
	{
		//*it==Person
		cout<< (* it).num<< " "<<(*it).name<<" "<<(*it).score<v1;
	v1.push_back(Person(100,"lucy",77.7f));
	v1.push_back(Person(103, "bob", 77.7f));
	v1.push_back(Person(101, "tom", 77.7f));
	v1.push_back(Person(104, "德瑪", 77.7f));
	v1.push_back(Person(105, "小法", 77.7f));

	printVectorPerson(v1);

	//對(duì)自定義類型的vector類型排序,需要修改排序規(guī)則
	sort(v1.begin(),v1.end(),comparePerson);
	printVectorPerson(v1);

}
int main(int argc,char *argv[])
{
	test8();
	return 0;
}
六、deque容器 1.deque容器基本概念

double ended queue,雙端隊(duì)列

vector與deque容器的大差異:

(1)deque允許在 頭尾兩端 分別做元素的插入和刪除操作,且 所用時(shí)間 僅 常數(shù)項(xiàng)時(shí)間。

【vector也可以頭部插入,但效率太低】

(2)沒(méi)有容量的概念。它是動(dòng)態(tài)的,以 分段定量連續(xù)空間 組合而成,隨時(shí)可以增加一段新的空間并連接起來(lái),不存在容量限制。

【也就是說(shuō),

像vector那樣 “空間不足而重新配置一塊更大空間,然后復(fù)制元素,再釋放舊空間” 的事情在deque這不存在。

因此deque不需要空間保留(reserve)功能,雖然deque容器也提供了Random Access Iterator,但它的迭代器并不是普通的指針,其復(fù)雜度和vector不是一個(gè)量級(jí)。

因此,除非有必要,盡量使用vector而不是deque。

對(duì)deque進(jìn)行排序操作,為了提高效率??梢詫eque完整復(fù)制到一個(gè)vector中,對(duì)vector容器進(jìn)行排序,再?gòu)?fù)制回deque。】

2.deque容器實(shí)現(xiàn)原理

array無(wú)法擴(kuò)張

vector尾端假擴(kuò)張:申請(qǐng)更大空間-->原數(shù)據(jù)復(fù)制新空間-->釋放原空間

deque雙端真擴(kuò)張

deque采取一塊map作為主控(注意不是STL的map容器,是一小段連續(xù)的內(nèi)存空間),其中每一個(gè)元素(結(jié)點(diǎn))都是一個(gè)指針,指向另一段連續(xù)性內(nèi)存空間,稱作緩沖區(qū)。緩沖區(qū)才是deque的存儲(chǔ)空間主體。

Deque由一段段定量連續(xù)空間構(gòu)成。當(dāng)在deque前端或尾端增加新空間時(shí),便串接一段連續(xù)定量的空間。

deque避開了重新配置空間、復(fù)制、釋放的輪回,代價(jià)就是復(fù)雜的迭代器架構(gòu)和數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)。

3.deque常用API

#includeusing namespace std;
#includevoid printDequeInt(deque& d)
{
	deque::iterator it = d.begin();
	for (; it != d.end(); it++)
	{
		cout<< *it<< " ";
	}
	cout<< endl;
}

void test1()
{	
	dequed1;
	d1.push_back(1);//4.1
	d1.push_back(2);
	d1.push_back(3);
	d1.push_front(4);//4.2
	d1.push_front(5);
	d1.push_front(6);
	printDequeInt(d1);
	cout<< "大?。?<< d1.size()<< endl;
	d1.pop_front();//4.4
	printDequeInt(d1);
	d1.pop_back();//4.3
	printDequeInt(d1);

	d1.insert(d1.begin() + 1, 3, 100);//6.2
	printDequeInt(d1);
}

//8
#include#include
class Person
{
public:
	string name;
	float score;
public:
	Person() {}
	Person(string name, float score)
	{
		this->name = name;
		this->score = score;
	}
};

void createPerson(vector& v)
{
	string tmpName = "ABCDE";
	int i = 0;
	for (i = 0; i< 5; i++)
	{
		string name = "選手";
		name += tmpName[i];
		v.push_back(Person(name, 0.0f));
	}
}

void showPerson(vector&v)
{
	vector::iterator it = v.begin();
	for (; it != v.end(); it++)
	{
		//*it==Person
		cout<< (*it).name<< " "<< (*it).score<< endl;
		//以下寫法也可以,但是是把迭代器看成了指針,容易出錯(cuò),其他迭代器上可能就不能用了。 
		//cout<< it->name<< " "<< it->score<< endl;
	}
}

void playGame(vector&v)
{
	//每人逐個(gè)比賽
	vector::iterator it = v.begin();
	for (; it != v.end(); it++)
	{
		//定義一個(gè)deque容器存放10個(gè)評(píng)委的分?jǐn)?shù)
		dequed;
		int i = 0;
		for (i = 0; i< 10; i++)
		{
			d.push_back((float)(rand() % 41 + 60));//rand() % 41:生成0-41間的一個(gè)隨機(jī)數(shù)。 
		}
		//對(duì)deque排序
		sort(d.begin(), d.end());

		//去掉最低最高分
		d.pop_back();
		d.pop_front();
		//求平均分
		(*it).score = (float)accumulate(d.begin(), d.end(),0)/d.size();
	}
}
#includevoid test2()
{
	vectorv;
	//srand設(shè)置隨機(jī)數(shù)種子
	srand(time(NULL));
	//創(chuàng)建五名選手
	createPerson(v);

	//比賽
	playGame(v);
	//顯示選手成績(jī)
	showPerson(v);
}

int main(int argc, char* argv[])
{
	test2();
	return 0;
}
七、stack容器 1.stack容器的基本概念

stack是一種 先進(jìn)后出 的數(shù)據(jù)結(jié)構(gòu),stack容器只能 新增、刪除、取得 棧頂元素。

stack不允許 遍歷,沒(méi)有迭代器?!局挥幸粋€(gè)出口,除了最頂端外,沒(méi)有其他方法可以存取stack的其他元素】

2.stack常用API

八、queue容器 1.queue容器的基本概念

queue是一種 先進(jìn)先出 的數(shù)據(jù)結(jié)構(gòu),允許元素從隊(duì)尾新增入隊(duì),從隊(duì)頭移除出隊(duì)。

2.queue常用API

九、list容器 1.list容器的基本概念

list容器是一個(gè)雙向鏈表。

鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。

插入和刪除元素是常數(shù)時(shí)間,無(wú)需像靜態(tài)鏈表(數(shù)組)那樣移動(dòng)大量元素。

采用動(dòng)態(tài)存儲(chǔ)分配。靈活,但消耗了空間和時(shí)間。

2.list常用API

list容器的迭代器是雙向迭代器,

  • 不支持 +2 這種(隨機(jī)訪問(wèn)迭代器支持,像vector的),支持++(因?yàn)?+運(yùn)算符可以重載);
  • 不支持 STL提供的算法(STL提供的算法(像sort)只支持隨機(jī)訪問(wèn)迭代器)

【可以寫(對(duì)象)h1.sort();】

十、set/multiset容器 1.set/multiset容器的基本概念

特征:set的所有元素會(huì)根據(jù) 鍵值 自動(dòng)排序。

  • set的元素既是鍵值又是實(shí)值,或者可以認(rèn)為它只有鍵值。
  • set不允許兩個(gè)元素有相同的鍵值。multiset 特性及用法 與 set 完全相同,唯一差別在于它允許鍵值重復(fù)(即可以插入相同元素)。
  • set迭代器 是 只讀迭代器,不允許修改鍵值,會(huì)破壞set的內(nèi)存布局?!疽?yàn)閟et插入元素時(shí)才排序,如果修改元素內(nèi)容,就無(wú)序了,容器布局就變了】

2.set/multiset常用API

因?yàn)閟et插入元素就自動(dòng)排序好了,所以沒(méi)有push_back/push_front這種。

修改排序規(guī)則:

  • 應(yīng)該在定義類對(duì)象時(shí)修改,set

【先定義類對(duì)象,再插入元素。因?yàn)椴迦霑r(shí)就自動(dòng)排序了,所以應(yīng)該在插入之前修改排序規(guī)則,也就是在定義類對(duì)象時(shí)修改】

  • 因?yàn)樵诩饫ㄌ?hào)內(nèi),排序規(guī)則須是一個(gè)類,同時(shí)也是一個(gè)函數(shù),所以我們用 仿函數(shù) 來(lái)寫規(guī)則。

【仿函數(shù):重載函數(shù)調(diào)用運(yùn)算符()的類】

  • set存放自定義數(shù)據(jù)必須修改排序。

【同vector實(shí)操最后面出現(xiàn)的。自定義類型不指定排序規(guī)則的話,sort不知道你是依據(jù)哪個(gè)成員變量來(lái)排序】

3.對(duì)組(pair)

將一對(duì)值組合成一個(gè)值,這一對(duì)值可以具有不同的數(shù)據(jù)類型,兩個(gè)值可以分別用pair的兩個(gè)公用屬性 first 和 second 。

模板:templatestruct pair

void test()
{
//方式一:
pairp1(10086,"移動(dòng)");
pairp2(10010,"聯(lián)通");
pairp3(10000,"電信");

//方式二:(推薦)
pairp4=make_pair(9527,"星爺");

cout<
十一、map/multimap容器 1.map/multimap容器的基本概念
  • map的所有元素都是pair?!緋air的第一元素被認(rèn)為是 鍵值 ,第二元素被認(rèn)為是 實(shí)值】
  • 所有元素會(huì)根據(jù)鍵值自動(dòng)排序。
  • map鍵值不能重復(fù)、不能修改。

multimap和map唯一區(qū)別在于,multimap鍵值可重復(fù)。

map和multimap都是以 紅黑樹 為底層實(shí)現(xiàn)機(jī)制。?

2.map/multimap常用API

3.multimap案例

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

文章名稱:第十九章-創(chuàng)新互聯(lián)
URL分享:http://jinyejixie.com/article6/jecig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版響應(yīng)式網(wǎng)站、動(dòng)態(tài)網(wǎng)站ChatGPT、企業(yè)建站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

中西区| 桓台县| 德安县| 教育| 兖州市| 临夏市| 湟中县| 南投市| 普洱| 苍溪县| 海林市| 克什克腾旗| 琼结县| 无锡市| 普定县| 和顺县| 张家界市| 夏津县| 合作市| 疏附县| 故城县| 嘉兴市| 仙桃市| 绥阳县| 巴楚县| 汽车| 三江| 彰武县| 武清区| 万全县| 嘉义县| 江口县| 罗定市| 罗源县| 广平县| 苗栗县| 团风县| 溧阳市| 绥江县| 日照市| 娱乐|