成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

熬夜爆肝!C++核心STL容器知識(shí)點(diǎn)匯總整理【3W字干貨預(yù)警 建議收藏】

wayneli / 2441人閱讀

摘要:拷貝構(gòu)造函數(shù)示例構(gòu)造無參構(gòu)造函數(shù)總結(jié)容器和容器的構(gòu)造方式幾乎一致,靈活使用即可賦值操作功能描述給容器進(jìn)行賦值函數(shù)原型重載等號(hào)操作符將區(qū)間中的數(shù)據(jù)拷貝賦值給本身。清空容器的所有數(shù)據(jù)刪除區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。

前言

前段時(shí)間有粉絲問我,c++基礎(chǔ)學(xué)完了,不知道自己后面該繼續(xù)深入學(xué)習(xí)什么?C++進(jìn)階要掌握那些知識(shí)點(diǎn)?

前幾天,我們已經(jīng)整理了部分C++進(jìn)階篇STL知識(shí),C++進(jìn)階篇STL容器string知識(shí)點(diǎn),今天我們繼續(xù)來學(xué)習(xí)下STL其余常見容器,,一起來看看吧!

以下內(nèi)容主要根據(jù)網(wǎng)上資料進(jìn)行合并整理,如有侵權(quán),請(qǐng)私信我。

1 STL- 常用容器

1.1 vector容器

1.1.1 vector基本概念

功能:

  • vector數(shù)據(jù)結(jié)構(gòu)和數(shù)組非常相似,也稱為單端數(shù)組

vector與普通數(shù)組區(qū)別:

  • 不同之處在于數(shù)組是靜態(tài)空間,而vector可以動(dòng)態(tài)擴(kuò)展

動(dòng)態(tài)擴(kuò)展:

  • 不是在原空間之后續(xù)接新空間,是找更大的內(nèi)存空間,將原數(shù)據(jù)拷貝新空間,釋放原空間

  • vector容器的迭代器是支持隨機(jī)訪問的迭代器

1.1.2 vector構(gòu)造函數(shù)

功能描述:

  • 創(chuàng)建vector容器

函數(shù)原型:

  • vector v; //采用模板實(shí)現(xiàn)類實(shí)現(xiàn),默認(rèn)構(gòu)造函數(shù)
  • vector(v.begin(), v.end()); //將v[begin(), end())區(qū)間中的元素拷貝給本身。
  • vector(n, elem); //構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。
  • vector(const vector &vec); //拷貝構(gòu)造函數(shù)。

案例:

#include void printVector(vector& v) {	for (vector::iterator it = v.begin(); it != v.end(); it++) {		cout << *it << " ";	}	cout << endl;}void test01(){	vector v1; //無參構(gòu)造	for (int i = 0; i < 10; i++)	{		v1.push_back(i);	}	printVector(v1);	vector v2(v1.begin(), v1.end());	printVector(v2);	vector v3(10, 100);	printVector(v3);		vector v4(v3);	printVector(v4);}int main() {	test01();	system("pause");	return 0;}

1.1.3 vector賦值操作

功能描述:

  • 給vector容器進(jìn)行賦值

函數(shù)原型:

  • vector& operator=(const vector &vec);//重載等號(hào)操作符

  • assign(beg, end); //將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。

  • assign(n, elem); //將n個(gè)elem拷貝賦值給本身。

示例:

#include void printVector(vector& v) {	for (vector::iterator it = v.begin(); it != v.end(); it++) {		cout << *it << " ";	}	cout << endl;}//賦值操作void test01(){	vector v1; //無參構(gòu)造	for (int i = 0; i < 10; i++)	{		v1.push_back(i);	}	printVector(v1);	vectorv2;	v2 = v1;	printVector(v2);	vectorv3;	v3.assign(v1.begin(), v1.end());	printVector(v3);	vectorv4;	v4.assign(10, 100);	printVector(v4);}int main() {	test01();	system("pause");	return 0;}

總結(jié): vector賦值方式比較簡單,使用operator=,或者assign都可以

1.1.4 vector容量和大小

功能描述:

  • 對(duì)vector容器的容量和大小操作

函數(shù)原型:

  • empty(); //判斷容器是否為空

  • capacity(); //容器的容量

  • size(); //返回容器中元素的個(gè)數(shù)

  • resize(int num); //重新指定容器的長度為num,若容器變長,則以默認(rèn)值填充新位置。

    ? //如果容器變短,則末尾超出容器長度的元素被刪除。

  • resize(int num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。

    ? //如果容器變短,則末尾超出容器長度的元素被刪除

示例:

#include void printVector(vector& v) {	for (vector::iterator it = v.begin(); it != v.end(); it++) {		cout << *it << " ";	}	cout << endl;}void test01(){	vector v1;	for (int i = 0; i < 10; i++)	{		v1.push_back(i);	}	printVector(v1);	if (v1.empty())	{		cout << "v1為空" << endl;	}	else	{		cout << "v1不為空" << endl;		cout << "v1的容量 = " << v1.capacity() << endl;		cout << "v1的大小 = " << v1.size() << endl;	}	//resize 重新指定大小 ,若指定的更大,默認(rèn)用0填充新位置,可以利用重載版本替換默認(rèn)填充	v1.resize(15,10);	printVector(v1);	//resize 重新指定大小 ,若指定的更小,超出部分元素被刪除	v1.resize(5);	printVector(v1);}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 判斷是否為空 — empty
  • 返回元素個(gè)數(shù) — size
  • 返回容器容量 — capacity
  • 重新指定大小 — resize

1.1.5 vector插入和刪除

功能描述:

  • 對(duì)vector容器進(jìn)行插入、刪除操作

函數(shù)原型:

  • push_back(ele); //尾部插入元素ele
  • pop_back(); //刪除最后一個(gè)元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個(gè)元素ele
  • erase(const_iterator pos); //刪除迭代器指向的元素
  • erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素
  • clear(); //刪除容器中所有元素

示例:

#include void printVector(vector<int>& v) {	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {		cout << *it << " ";	}	cout << endl;}//插入和刪除void test01(){	vector<int> v1;	//尾插	v1.push_back(10);	v1.push_back(20);	v1.push_back(30);	v1.push_back(40);	v1.push_back(50);	printVector(v1);	//尾刪	v1.pop_back();	printVector(v1);	//插入	v1.insert(v1.begin(), 100);	printVector(v1);	v1.insert(v1.begin(), 2, 1000);	printVector(v1);	//刪除	v1.erase(v1.begin());	printVector(v1);	//清空	v1.erase(v1.begin(), v1.end());	v1.clear();	printVector(v1);}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 尾插 — push_back
  • 尾刪 — pop_back
  • 插入 — insert (位置迭代器)
  • 刪除 — erase (位置迭代器)
  • 清空 — clear

1.1.6 vector數(shù)據(jù)存取

功能描述:

  • 對(duì)vector中的數(shù)據(jù)的存取操作

函數(shù)原型:

  • at(int idx); //返回索引idx所指的數(shù)據(jù)
  • operator[]; //返回索引idx所指的數(shù)據(jù)
  • front(); //返回容器中第一個(gè)數(shù)據(jù)元素
  • back(); //返回容器中最后一個(gè)數(shù)據(jù)元素

示例:

#include void test01(){	vectorv1;	for (int i = 0; i < 10; i++)	{		v1.push_back(i);	}	for (int i = 0; i < v1.size(); i++)	{		cout << v1[i] << " ";	}	cout << endl;	for (int i = 0; i < v1.size(); i++)	{		cout << v1.at(i) << " ";	}	cout << endl;	cout << "v1的第一個(gè)元素為: " << v1.front() << endl;	cout << "v1的最后一個(gè)元素為: " << v1.back() << endl;}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 除了用迭代器獲取vector容器中元素,[ ]和at也可以
  • front返回容器第一個(gè)元素
  • back返回容器最后一個(gè)元素

1.1.7 vector互換容器

功能描述:

  • 實(shí)現(xiàn)兩個(gè)容器內(nèi)元素進(jìn)行互換

函數(shù)原型:

  • swap(vec); // 將vec與本身的元素互換

示例:

#include void printVector(vector& v) {	for (vector::iterator it = v.begin(); it != v.end(); it++) {		cout << *it << " ";	}	cout << endl;}void test01(){	vectorv1;	for (int i = 0; i < 10; i++)	{		v1.push_back(i);	}	printVector(v1);	vectorv2;	for (int i = 10; i > 0; i--)	{		v2.push_back(i);	}	printVector(v2);	//互換容器	cout << "互換后" << endl;	v1.swap(v2);	printVector(v1);	printVector(v2);}void test02(){	vector v;	for (int i = 0; i < 100000; i++) {		v.push_back(i);	}	cout << "v的容量為:" << v.capacity() << endl;	cout << "v的大小為:" << v.size() << endl;	v.resize(3);	cout << "v的容量為:" << v.capacity() << endl;	cout << "v的大小為:" << v.size() << endl;	//收縮內(nèi)存	vector(v).swap(v); //匿名對(duì)象	cout << "v的容量為:" << v.capacity() << endl;	cout << "v的大小為:" << v.size() << endl;}int main() {	test01();	test02();	system("pause");	return 0;}

總結(jié):swap可以使兩個(gè)容器互換,可以達(dá)到實(shí)用的收縮內(nèi)存效果

1.1.8 vector預(yù)留空間

功能描述:

  • 減少vector在動(dòng)態(tài)擴(kuò)展容量時(shí)的擴(kuò)展次數(shù)

函數(shù)原型:

  • reserve(int len);//容器預(yù)留len個(gè)元素長度,預(yù)留位置不初始化,元素不可訪問。

示例:

#include void test01(){	vector v;	//預(yù)留空間	v.reserve(100000);	int num = 0;	int* p = NULL;	for (int i = 0; i < 100000; i++) {		v.push_back(i);		if (p != &v[0]) {			p = &v[0];			num++;		}	}	cout << "num:" << num << endl;}int main() {	test01();    	system("pause");	return 0;}

總結(jié):如果數(shù)據(jù)量較大,可以一開始利用reserve預(yù)留空間

1.2 deque容器

1.2.1 deque容器基本概念

功能:

  • 雙端數(shù)組,可以對(duì)頭端進(jìn)行插入刪除操作

deque與vector區(qū)別:

  • vector對(duì)于頭部的插入刪除效率低,數(shù)據(jù)量越大,效率越低
  • deque相對(duì)而言,對(duì)頭部的插入刪除速度回比vector快
  • vector訪問元素時(shí)的速度會(huì)比deque快,這和兩者內(nèi)部實(shí)現(xiàn)有關(guān)

deque內(nèi)部工作原理:

deque內(nèi)部有個(gè)中控器,維護(hù)每段緩沖區(qū)中的內(nèi)容,緩沖區(qū)中存放真實(shí)數(shù)據(jù)

中控器維護(hù)的是每個(gè)緩沖區(qū)的地址,使得使用deque時(shí)像一片連續(xù)的內(nèi)存空間

  • deque容器的迭代器也是支持隨機(jī)訪問的

1.2.2 deque構(gòu)造函數(shù)

功能描述:

  • deque容器構(gòu)造

函數(shù)原型:

  • deque deqT; //默認(rèn)構(gòu)造形式
  • deque(beg, end); //構(gòu)造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身。
  • deque(n, elem); //構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。
  • deque(const deque &deq); //拷貝構(gòu)造函數(shù)

示例:

#include void printDeque(const deque& d) {	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {		cout << *it << " ";	}	cout << endl;}//deque構(gòu)造void test01() {	deque d1; //無參構(gòu)造函數(shù)	for (int i = 0; i < 10; i++)	{		d1.push_back(i);	}	printDeque(d1);	deque d2(d1.begin(),d1.end());	printDeque(d2);	dequed3(10,100);	printDeque(d3);	dequed4 = d3;	printDeque(d4);}int main() {	test01();	system("pause");	return 0;}

**總結(jié):**deque容器和vector容器的構(gòu)造方式幾乎一致,靈活使用即可

1.2.3 deque賦值操作

功能描述:

  • 給deque容器進(jìn)行賦值

函數(shù)原型:

  • deque& operator=(const deque &deq); //重載等號(hào)操作符

  • assign(beg, end); //將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。

  • assign(n, elem); //將n個(gè)elem拷貝賦值給本身。

示例:

#include void printDeque(const deque& d) {	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {		cout << *it << " ";	}	cout << endl;}//賦值操作void test01(){	deque d1;	for (int i = 0; i < 10; i++)	{		d1.push_back(i);	}	printDeque(d1);	dequed2;	d2 = d1;	printDeque(d2);	dequed3;	d3.assign(d1.begin(), d1.end());	printDeque(d3);	dequed4;	d4.assign(10, 100);	printDeque(d4);}int main() {	test01();	system("pause");	return 0;}

1.2.4 deque大小操作

功能描述:

  • 對(duì)deque容器的大小進(jìn)行操作

函數(shù)原型:

  • deque.empty(); //判斷容器是否為空

  • deque.size(); //返回容器中元素的個(gè)數(shù)

  • deque.resize(num); //重新指定容器的長度為num,若容器變長,則以默認(rèn)值填充新位置。

    ? //如果容器變短,則末尾超出容器長度的元素被刪除。

  • deque.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。

    ? //如果容器變短,則末尾超出容器長度的元素被刪除。

示例:

#include void printDeque(const deque& d) {	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {		cout << *it << " ";	}	cout << endl;}//大小操作void test01(){	deque d1;	for (int i = 0; i < 10; i++)	{		d1.push_back(i);	}	printDeque(d1);	//判斷容器是否為空	if (d1.empty()) {		cout << "d1為空!" << endl;	}	else {		cout << "d1不為空!" << endl;		//統(tǒng)計(jì)大小		cout << "d1的大小為:" << d1.size() << endl;	}	//重新指定大小	d1.resize(15, 1);	printDeque(d1);	d1.resize(5);	printDeque(d1);}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • deque沒有容量的概念
  • 判斷是否為空 — empty
  • 返回元素個(gè)數(shù) — size
  • 重新指定個(gè)數(shù) — resize

1.2.5 deque 插入和刪除

功能描述:

  • 向deque容器中插入和刪除數(shù)據(jù)

函數(shù)原型:

兩端插入操作:

  • push_back(elem); //在容器尾部添加一個(gè)數(shù)據(jù)
  • push_front(elem); //在容器頭部插入一個(gè)數(shù)據(jù)
  • pop_back(); //刪除容器最后一個(gè)數(shù)據(jù)
  • pop_front(); //刪除容器第一個(gè)數(shù)據(jù)

指定位置操作:

  • insert(pos,elem); //在pos位置插入一個(gè)elem元素的拷貝,返回新數(shù)據(jù)的位置。

  • insert(pos,n,elem); //在pos位置插入n個(gè)elem數(shù)據(jù),無返回值。

  • insert(pos,beg,end); //在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。

  • clear(); //清空容器的所有數(shù)據(jù)

  • erase(beg,end); //刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。

  • erase(pos); //刪除pos位置的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。

示例:

#include void printDeque(const deque& d) {	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {		cout << *it << " ";	}	cout << endl;}//兩端操作void test01(){	deque d;	//尾插	d.push_back(10);	d.push_back(20);	//頭插	d.push_front(100);	d.push_front(200);	printDeque(d);	//尾刪	d.pop_back();	//頭刪	d.pop_front();	printDeque(d);}//插入void test02(){	deque d;	d.push_back(10);	d.push_back(20);	d.push_front(100);	d.push_front(200);	printDeque(d);	d.insert(d.begin(), 1000);	printDeque(d);	d.insert(d.begin(), 2,10000);	printDeque(d);	dequed2;	d2.push_back(1);	d2.push_back(2);	d2.push_back(3);	d.insert(d.begin(), d2.begin(), d2.end());	printDeque(d);}//刪除void test03(){	deque d;	d.push_back(10);	d.push_back(20);	d.push_front(100);	d.push_front(200);	printDeque(d);	d.erase(d.begin());	printDeque(d);	d.erase(d.begin(), d.end());	d.clear();	printDeque(d);}int main() {	//test01();	//test02();    test03();    	system("pause");	return 0;}

總結(jié):

  • 插入和刪除提供的位置是迭代器!
  • 尾插 — push_back
  • 尾刪 — pop_back
  • 頭插 — push_front
  • 頭刪 — pop_front

1.2.6 deque 數(shù)據(jù)存取

功能描述:

  • 對(duì)deque 中的數(shù)據(jù)的存取操作

函數(shù)原型:

  • at(int idx); //返回索引idx所指的數(shù)據(jù)
  • operator[]; //返回索引idx所指的數(shù)據(jù)
  • front(); //返回容器中第一個(gè)數(shù)據(jù)元素
  • back(); //返回容器中最后一個(gè)數(shù)據(jù)元素

示例:

#include void printDeque(const deque& d) {	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {		cout << *it << " ";	}	cout << endl;}//數(shù)據(jù)存取void test01(){	deque d;	d.push_back(10);	d.push_back(20);	d.push_front(100);	d.push_front(200);	for (int i = 0; i < d.size(); i++) {		cout << d[i] << " ";	}	cout << endl;	for (int i = 0; i < d.size(); i++) {		cout << d.at(i) << " ";	}	cout << endl;	cout << "front:" << d.front() << endl;	cout << "back:" << d.back() << endl;}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 除了用迭代器獲取deque容器中元素,[ ]和at也可以
  • front返回容器第一個(gè)元素
  • back返回容器最后一個(gè)元素

1.2.7 deque 排序

功能描述:

  • 利用算法實(shí)現(xiàn)對(duì)deque容器進(jìn)行排序

算法:

  • sort(iterator beg, iterator end) //對(duì)beg和end區(qū)間內(nèi)元素進(jìn)行排序

示例:

#include #include void printDeque(const deque& d) {	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {		cout << *it << " ";	}	cout << endl;}void test01(){	deque d;	d.push_back(10);	d.push_back(20);	d.push_front(100);	d.push_front(200);	printDeque(d);	sort(d.begin(), d.end());	printDeque(d);}int main() {	test01();	system("pause");	return 0;}

1.3 stack容器

1.3.1 stack 基本概念

概念:stack是一種先進(jìn)后出(First In Last Out,FILO)的數(shù)據(jù)結(jié)構(gòu),它只有一個(gè)出口

棧中只有頂端的元素才可以被外界使用,因此棧不允許有遍歷行為

棧中進(jìn)入數(shù)據(jù)稱為 — 入棧 push

棧中彈出數(shù)據(jù)稱為 — 出棧 pop

1.3.2 stack 常用接口

功能描述:棧容器常用的對(duì)外接口

構(gòu)造函數(shù):

  • stack stk; //stack采用模板類實(shí)現(xiàn), stack對(duì)象的默認(rèn)構(gòu)造形式
  • stack(const stack &stk); //拷貝構(gòu)造函數(shù)

賦值操作:

  • stack& operator=(const stack &stk); //重載等號(hào)操作符

數(shù)據(jù)存?。?/p>

  • push(elem); //向棧頂添加元素
  • pop(); //從棧頂移除第一個(gè)元素
  • top(); //返回棧頂元素

大小操作:

  • empty(); //判斷堆棧是否為空
  • size(); //返回棧的大小

示例:

#include //棧容器常用接口void test01(){	//創(chuàng)建棧容器 棧容器必須符合先進(jìn)后出	stack s;	//向棧中添加元素,叫做 壓棧 入棧	s.push(10);	s.push(20);	s.push(30);	while (!s.empty()) {		//輸出棧頂元素		cout << "棧頂元素為: " << s.top() << endl;		//彈出棧頂元素		s.pop();	}	cout << "棧的大小為:" << s.size() << endl;}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 入棧 — push
  • 出棧 — pop
  • 返回棧頂 — top
  • 判斷棧是否為空 — empty
  • 返回棧大小 — size

1.4 queue 容器

1.4.1 queue 基本概念

概念:Queue是一種先進(jìn)先出(First In First Out,FIFO)的數(shù)據(jù)結(jié)構(gòu),它有兩個(gè)出口

隊(duì)列容器允許從一端新增元素,從另一端移除元素

隊(duì)列中只有隊(duì)頭和隊(duì)尾才可以被外界使用,因此隊(duì)列不允許有遍歷行為

隊(duì)列中進(jìn)數(shù)據(jù)稱為 — 入隊(duì) push

隊(duì)列中出數(shù)據(jù)稱為 — 出隊(duì) pop

1.4.2 queue 常用接口

功能描述:棧容器常用的對(duì)外接口

構(gòu)造函數(shù):

  • queue que; //queue采用模板類實(shí)現(xiàn),queue對(duì)象的默認(rèn)構(gòu)造形式
  • queue(const queue &que); //拷貝構(gòu)造函數(shù)

賦值操作:

  • queue& operator=(const queue &que); //重載等號(hào)操作符

數(shù)據(jù)存?。?/p>

  • push(elem); //往隊(duì)尾添加元素
  • pop(); //從隊(duì)頭移除第一個(gè)元素
  • back(); //返回最后一個(gè)元素
  • front(); //返回第一個(gè)元素

大小操作:

  • empty(); //判斷堆棧是否為空
  • size(); //返回棧的大小

示例:

#include #include class Person{public:	Person(string name, int age)	{		this->m_Name = name;		this->m_Age = age;	}	string m_Name;	int m_Age;};void test01() {	//創(chuàng)建隊(duì)列	queue q;	//準(zhǔn)備數(shù)據(jù)	Person p1("唐僧", 30);	Person p2("孫悟空", 1000);	Person p3("豬八戒", 900);	Person p4("沙僧", 800);	//向隊(duì)列中添加元素  入隊(duì)操作	q.push(p1);	q.push(p2);	q.push(p3);	q.push(p4);	//隊(duì)列不提供迭代器,更不支持隨機(jī)訪問		while (!q.empty()) {		//輸出隊(duì)頭元素		cout << "隊(duì)頭元素-- 姓名: " << q.front().m_Name               << " 年齡: "<< q.front().m_Age << endl;        		cout << "隊(duì)尾元素-- 姓名: " << q.back().m_Name                << " 年齡: " << q.back().m_Age << endl;        		cout << endl;		//彈出隊(duì)頭元素		q.pop();	}	cout << "隊(duì)列大小為:" << q.size() << endl;}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 入隊(duì) — push
  • 出隊(duì) — pop
  • 返回隊(duì)頭元素 — front
  • 返回隊(duì)尾元素 — back
  • 判斷隊(duì)是否為空 — empty
  • 返回隊(duì)列大小 — size

1.5 list容器

1.5.1 list基本概念

**功能:**將數(shù)據(jù)進(jìn)行鏈?zhǔn)酱鎯?chǔ)

鏈表(list)是一種物理存儲(chǔ)單元上非連續(xù)的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接實(shí)現(xiàn)的

鏈表的組成:鏈表由一系列結(jié)點(diǎn)組成

結(jié)點(diǎn)的組成:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域

STL中的鏈表是一個(gè)雙向循環(huán)鏈表

由于鏈表的存儲(chǔ)方式并不是連續(xù)的內(nèi)存空間,因此鏈表list中的迭代器只支持前移和后移,屬于雙向迭代器

list的優(yōu)點(diǎn):

  • 采用動(dòng)態(tài)存儲(chǔ)分配,不會(huì)造成內(nèi)存浪費(fèi)和溢出
  • 鏈表執(zhí)行插入和刪除操作十分方便,修改指針即可,不需要移動(dòng)大量元素

list的缺點(diǎn):

  • 鏈表靈活,但是空間(指針域) 和 時(shí)間(遍歷)額外耗費(fèi)較大

List有一個(gè)重要的性質(zhì),插入操作和刪除操作都不會(huì)造成原有l(wèi)ist迭代器的失效,這在vector是不成立的。

總結(jié):STL中List和vector是兩個(gè)最常被使用的容器,各有優(yōu)缺點(diǎn)

1.5.2 list構(gòu)造函數(shù)

功能描述:

  • 創(chuàng)建list容器

函數(shù)原型:

  • list lst; //list采用采用模板類實(shí)現(xiàn),對(duì)象的默認(rèn)構(gòu)造形式:
  • list(beg,end); //構(gòu)造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身。
  • list(n,elem); //構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。
  • list(const list &lst); //拷貝構(gòu)造函數(shù)。

示例:

#include void printList(const list& L) {	for (list::const_iterator it = L.begin(); it != L.end(); it++) {		cout << *it << " ";	}	cout << endl;}void test01(){	listL1;	L1.push_back(10);	L1.push_back(20);	L1.push_back(30);	L1.push_back(40);	printList(L1);	listL2(L1.begin(),L1.end());	printList(L2);	listL3(L2);	printList(L3);	listL4(10, 1000);	printList(L4);}int main() {	test01();	system("pause");	return 0;}

1.5.3 list 賦值和交換

功能描述:

  • 給list容器進(jìn)行賦值,以及交換list容器

函數(shù)原型:

  • assign(beg, end); //將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。
  • assign(n, elem); //將n個(gè)elem拷貝賦值給本身。
  • list& operator=(const list &lst); //重載等號(hào)操作符
  • swap(lst); //將lst與本身的元素互換。

示例:

#include void printList(const list& L) {	for (list::const_iterator it = L.begin(); it != L.end(); it++) {		cout << *it << " ";	}	cout << endl;}//賦值和交換void test01(){	listL1;	L1.push_back(10);	L1.push_back(20);	L1.push_back(30);	L1.push_back(40);	printList(L1);	//賦值	listL2;	L2 = L1;	printList(L2);	listL3;	L3.assign(L2.begin(), L2.end());	printList(L3);	listL4;	L4.assign(10, 100);	printList(L4);}//交換void test02(){	listL1;	L1.push_back(10);	L1.push_back(20);	L1.push_back(30);	L1.push_back(40);	listL2;	L2.assign(10, 100);	cout << "交換前: " << endl;	printList(L1);	printList(L2);	cout << endl;	L1.swap(L2);	cout << "交換后: " << endl;	printList(L1);	printList(L2);}int main() {	//test01();	test02();	system("pause");	return 0;}

1.5.4 list 大小操作

功能描述:

  • 對(duì)list容器的大小進(jìn)行操作

函數(shù)原型:

  • size(); //返回容器中元素的個(gè)數(shù)

  • empty(); //判斷容器是否為空

  • resize(num); //重新指定容器的長度為num,若容器變長,則以默認(rèn)值填充新位置。

    ? //如果容器變短,則末尾超出容器長度的元素被刪除。

  • resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。

      				    //如果容器變短,則末尾超出容器長度的元素被刪除。

示例:

#include void printList(const list& L) {	for (list::const_iterator it = L.begin(); it != L.end(); it++) {		cout << *it << " ";	}	cout << endl;}//大小操作void test01(){	listL1;	L1.push_back(10);	L1.push_back(20);	L1.push_back(30);	L1.push_back(40);	if (L1.empty())	{		cout << "L1為空" << endl;	}	else	{		cout << "L1不為空" << endl;		cout << "L1的大小為: " << L1.size() << endl;	}	//重新指定大小	L1.resize(10);	printList(L1);	L1.resize(2);	printList(L1);}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 判斷是否為空 — empty
  • 返回元素個(gè)數(shù) — size
  • 重新指定個(gè)數(shù) — resize

1.5.5 list 插入和刪除

功能描述:

  • 對(duì)list容器進(jìn)行數(shù)據(jù)的插入和刪除

函數(shù)原型:

  • push_back(elem);//在容器尾部加入一個(gè)元素
  • pop_back();//刪除容器中最后一個(gè)元素
  • push_front(elem);//在容器開頭插入一個(gè)元素
  • pop_front();//從容器開頭移除第一個(gè)元素
  • insert(pos,elem);//在pos位置插e(cuò)lem元素的拷貝,返回新數(shù)據(jù)的位置。
  • insert(pos,n,elem);//在pos位置插入n個(gè)elem數(shù)據(jù),無返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。
  • clear();//移除容器的所有數(shù)據(jù)
  • erase(beg,end);//刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。
  • erase(pos);//刪除pos位置的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。
  • remove(elem);//刪除容器中所有與elem值匹配的元素。

示例:

#include void printList(const list& L) {	for (list::const_iterator it = L.begin(); it != L.end(); it++) {		cout << *it << " ";	}	cout << endl;}//插入和刪除void test01(){	list L;	//尾插	L.push_back(10);	L.push_back(20);	L.push_back(30);	//頭插	L.push_front(100);	L.push_front(200);	L.push_front(300);	printList(L);	//尾刪	L.pop_back();	printList(L);	//頭刪	L.pop_front();	printList(L);	//插入	list::iterator it = L.begin();	L.insert(++it, 1000);	printList(L);	//刪除	it = L.begin();	L.erase(++it);	printList(L);	//移除	L.push_back(10000);	L.push_back(10000);	L.push_back(10000);	printList(L);	L.remove(10000);	printList(L);        //清空	L.clear();	printList(L);}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 尾插 — push_back
  • 尾刪 — pop_back
  • 頭插 — push_front
  • 頭刪 — pop_front
  • 插入 — insert
  • 刪除 — erase
  • 移除 — remove
  • 清空 — clear

1.5.6 list 數(shù)據(jù)存取

功能描述:

  • 對(duì)list容器中數(shù)據(jù)進(jìn)行存取

函數(shù)原型:

  • front(); //返回第一個(gè)元素。
  • back(); //返回最后一個(gè)元素。

示例:

#include //數(shù)據(jù)存取void test01(){	listL1;	L1.push_back(10);	L1.push_back(20);	L1.push_back(30);	L1.push_back(40);		//cout << L1.at(0) << endl;//錯(cuò)誤 不支持at訪問數(shù)據(jù)	//cout << L1[0] << endl; //錯(cuò)誤  不支持[]方式訪問數(shù)據(jù)	cout << "第一個(gè)元素為: " << L1.front() << endl;	cout << "最后一個(gè)元素為: " << L1.back() << endl;	//list容器的迭代器是雙向迭代器,不支持隨機(jī)訪問	list::iterator it = L1.begin();	//it = it + 1;//錯(cuò)誤,不可以跳躍訪問,即使是+1}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • list容器中不可以通過[]或者at方式訪問數(shù)據(jù)
  • 返回第一個(gè)元素 — front
  • 返回最后一個(gè)元素 — back

1.5.7 list 反轉(zhuǎn)和排序

功能描述:

  • 將容器中的元素反轉(zhuǎn),以及將容器中的數(shù)據(jù)進(jìn)行排序

函數(shù)原型:

  • reverse(); //反轉(zhuǎn)鏈表
  • sort(); //鏈表排序

示例:

void printList(const list& L) {	for (list::const_iterator it = L.begin(); it != L.end(); it++) {		cout << *it << " ";	}	cout << endl;}bool myCompare(int val1 , int val2){	return val1 > val2;}//反轉(zhuǎn)和排序void test01(){	list L;	L.push_back(90);	L.push_back(30);	L.push_back(20);	L.push_back(70);	printList(L);	//反轉(zhuǎn)容器的元素	L.reverse();	printList(L);	//排序	L.sort(); //默認(rèn)的排序規(guī)則 從小到大	printList(L);	L.sort(myCompare); //指定規(guī)則,從大到小	printList(L);}int main() {	test01();	system("pause");	return 0;}

總結(jié):

  • 反轉(zhuǎn) — reverse
  • 排序 — sort (成員函數(shù))

1.5.8 排序案例

案例描述:將Person自定義數(shù)據(jù)類型進(jìn)行排序,Person中屬性有姓名、年齡、身高

排序規(guī)則:按照年齡進(jìn)行升序,如果年齡相同按照身高進(jìn)行降序

示例:

#include #include class Person {public:	Person(string name, int age , int height) {		m_Name = name;		m_Age = age;		m_Height = height;	}public:	string m_Name;  //姓名	int m_Age;      //年齡	int m_Height;   //身高};bool ComparePerson(Person& p1, Person& p2) {	if (p1.m_Age == p2.m_Age) {		return p1.m_Height  > p2.m_Height;	}	else	{		return  p1.m_Age < p2.m_Age;	}}void test01() {	list L;	Person p1("劉備", 35 , 175);	Person p2("曹操", 45 , 180);	Person p3("孫權(quán)", 40 , 170);	Person p4("趙云", 25 , 190);	Person p5("張飛", 35 , 160);	Person p6("關(guān)羽", 35 , 200);	L.push_back(p1);	L.push_back(p2);	L.push_back(p3);	L.push_back(p4);	L.push_back(p5);	L.push_back(p6);	for (list::iterator it = L.begin(); it != L.end(); it++) {		cout << "姓名: " << it->m_Name << " 年齡: " << it->m_Age               << " 身高: " << it->m_Height << endl;	}	cout << "---------------------------------" << endl;	L.sort(ComparePerson); //排序	for (list::iterator it = L.begin(); it != L.end(); it++) {		cout << "姓名: " << it->m_Name << " 年齡: " << it->m_Age               << " 身高: " << it->m_Height << endl;	}}int main() {	test01();	system("pause");	return 0;}
  • 對(duì)于自定義數(shù)據(jù)類型,必須要指定排序規(guī)則,否則編譯器不知道如何進(jìn)行排序

  • 高級(jí)排序只是在排序規(guī)則上再進(jìn)行一次邏輯規(guī)則制定,并不復(fù)雜

1.6 set/ multiset 容器

1.6.1 set基本概念

簡介:

  • 所有元素都會(huì)在插入時(shí)自動(dòng)被排序

本質(zhì):

  • set/multiset屬于關(guān)聯(lián)式容器,底層結(jié)構(gòu)是用二叉樹實(shí)現(xiàn)。

set和multiset區(qū)別

  • set不允許容器中有重復(fù)的元素
  • multiset允許容器中有重復(fù)的元素

1.6.2 set構(gòu)造和賦值

功能描述:創(chuàng)建set容器以及賦值

構(gòu)造:

  • set st; //默認(rèn)構(gòu)造函數(shù):
  • set(const set &st); //拷貝構(gòu)造函數(shù)

賦值:

  • set& operator=(const set &st); //重載等號(hào)操作符

示例:

#include void printSet(set & s){	for (set::iterator it = s.begin(); it != s.end(); it++)	{		cout << *it << " ";	}	cout << endl;}//構(gòu)造和賦值void test01(){	set s1;	s1.insert(10);	s1.insert(30);	s1.insert(20);	s1.insert(40);	printSet(s1);	//拷貝構(gòu)造	sets2(s1);	printSet(s2);	//賦值	sets3;	s3 = s2;	printSet(s3);}int main() {	test01();	system("pause");	return 0;}
  • set容器插入數(shù)據(jù)時(shí)用insert
  • set容器插入數(shù)據(jù)的數(shù)據(jù)會(huì)自動(dòng)排序

1.6.3 set大小和交換

功能描述:

  • 統(tǒng)計(jì)set容器大小以及交換set容器

函數(shù)原型:

  • size(); //返回容器中元素的數(shù)目
  • empty(); //判斷容器是否為空
  • swap(st); //交換兩個(gè)集合容器

示例:

#include void printSet(set & s){	for (set::iterator it = s.begin(); it != s.end(); it++)	{		cout << *it << " ";	}	cout << endl;}//大小void test01(){	set s1;		s1.insert(10);	s1.insert(30);	s1.insert(20);	s1.insert(40);	if (s1.empty())	{		cout << "s1為空" << endl;	}	else	{		cout << "s1不為空" << endl;		cout << "s1的大小為: " << s1.size() << endl;	}}//交換void test02(){	set s1;	s1.insert(10);	s1.insert(30);	s1.insert(20);	s1.insert(40);	set s2;	s2.insert(100);	s2.insert(300);	s2.insert(200);	s2.insert(400);	cout << "交換前" << endl;	printSet(s1);	printSet(s2);	cout << endl;	cout << "交換后" << endl;	s1.swap(s2);	printSet(s1);	printSet(s2);}int main() {	//test01();	test02();	system("pause");	return 0;}
  • 統(tǒng)計(jì)大小 — size
  • 判斷是否為空 — empty
  • 交換容器 — swap

1.6.4 set插入和刪除

功能描述:

  • set容器進(jìn)行插入數(shù)據(jù)和刪除數(shù)據(jù)

函數(shù)原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //刪除pos迭代器所指的元素,返回下一個(gè)元素的迭代器。
  • erase(beg, end); //刪除區(qū)間[beg,end)的所有元素 ,返回下一個(gè)元素的迭代器。
  • erase(elem); //刪除容器中值為elem的元素。

示例:

#include void printSet(set & s){	for (set::iterator it = s.begin(); it != s.end(); it++)	{		cout << *it << " ";	}	cout << endl;}//插入和刪除void test01(){	set s1;	//插入	s1.insert(10);	s1.insert(30);	s1.insert(20);	s1.insert(40);	printSet(s1);	//刪除	s1.erase(s1.begin());	printSet(s1);	s1.erase(30);	printSet(s1);	//清空	//s1.erase(s1.begin(), s1.end());	s1.clear();	printSet(s1);}int main() {	test01();	system("pause");	return 0;}
  • 插入 — insert
  • 刪除 — erase
  • 清空 — clear

1.6.5 set查找和統(tǒng)計(jì)

功能描述:

  • 對(duì)set容器進(jìn)行查找數(shù)據(jù)以及統(tǒng)計(jì)數(shù)據(jù)

函數(shù)原型:

  • find(key); //查找key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回set.end();
  • count(key); //統(tǒng)計(jì)key的元素個(gè)數(shù)

示例:

#include //查找和統(tǒng)計(jì)void test01(){	set s1;	//插入	s1.insert(10);	s1.insert(30);	s1.insert(20);	s1.insert(40);		//查找	set::iterator pos = s1.find(30);	if (pos != s1.end())	{		cout << "找到了元素 : " << *pos << endl;	}	else	{		cout << "未找到元素" << endl;	}	//統(tǒng)計(jì)	int num = s1.count(30);	cout << "num = " << num << endl;}int main() {	test01();	system("pause");	return 0;}
  • 查找 — find (返回的是迭代器)
  • 統(tǒng)計(jì) — count (對(duì)于set,結(jié)果為0或者1)

1.6.6 set和multiset區(qū)別

區(qū)別:

  • set不可以插入重復(fù)數(shù)據(jù),而multiset可以
  • set插入數(shù)據(jù)的同時(shí)會(huì)返回插入結(jié)果,表示插入是否成功
  • multiset不會(huì)檢測(cè)數(shù)據(jù),因此可以插入重復(fù)數(shù)據(jù)

示例:

#include //set和multiset區(qū)別void test01(){	set s;	pair::iterator, bool>  ret = s.insert(10);	if (ret.second) {		cout << "第一次插入成功!" << endl;	}	else {		cout << "第一次插入失敗!" << endl;	}	ret = s.insert(10);	if (ret.second) {		cout << "第二次插入成功!" << endl;	}	else {		cout << "第二次插入失敗!" << endl;	}    	//multiset	multiset ms;	ms.insert(10);	ms.insert(10);	for (multiset::iterator it = ms.begin(); it != ms.end(); it++) {		cout << *it << " ";	}	cout << endl;}int main() {	test01();	system("pause");	return 0;}
  • 如果不允許插入重復(fù)數(shù)據(jù)可以利用set
  • 如果需要插入重復(fù)數(shù)據(jù)利用multiset

1.6.7 pair對(duì)組創(chuàng)建

功能描述:

  • 成對(duì)出現(xiàn)的數(shù)據(jù),利用對(duì)組可以返回兩個(gè)數(shù)據(jù)

創(chuàng)建方式:

  • pair p ( value1, value2 );
  • pair p = make_pair( value1, value2 );

示例:

#include //對(duì)組創(chuàng)建void test01(){	pair p(string("Tom"), 20);	cout << "姓名: " <<  p.first << " 年齡: " << p.second << endl;	pair p2 = make_pair("Jerry", 10);	cout << "姓名: " << p2.first << " 年齡: " << p2.second << endl;}int main() {	test01();	system("pause");	return 0;}

1.6.8 set容器排序

示例一: set存放內(nèi)置數(shù)據(jù)類型

#include class MyCompare {public:	bool operator()(int v1, int v2) {		return v1 > v2;	}};void test01() {    	set s1;	s1.insert(10);	s1.insert(40);	s1.insert(20);	s1.insert(30);	s1.insert(50);	//默認(rèn)從小到大	for (set::iterator it = s1.begin(); it != s1.end(); it++) {		cout << *it << " ";	}	cout << endl;	//指定排序規(guī)則	set s2;	s2.insert(10);	s2.insert(40);	s2.insert(20);	s2.insert(30);	s2.insert(50);	for (set::iterator it = s2.begin(); it != s2.end(); it++) {		cout << *it << " ";	}	cout << endl;}int main() {	test01();	system("pause");	return 0;}

利用仿函數(shù)可以指定set容器的排序規(guī)則

示例二: set存放自定義數(shù)據(jù)類型

#include #include class Person{public:	Person(string name, int age)	{		this->m_Name = name;		this->m_Age = age;	}	string m_Name;	int m_Age;};class comparePerson{public:	bool operator()(const Person& p1, const Person &p2)	{		//按照年齡進(jìn)行排序  降序		return p1.m_Age > p2.m_Age;	}};void test01(){	set s;	Person p1("劉備", 23);	Person p2("關(guān)羽", 27);	Person p3("張飛", 25);	Person p4("趙云", 21);	s.insert(p1);	s.insert(p2);	s.insert(p3);	s.insert(p4);	for (set::iterator it = s.begin(); it != s.end(); it++)	{		cout << "姓名: " << it->m_Name << " 年齡: " << it->m_Age << endl;	}}int main() {	test01();	system("pause");	return 0;}

對(duì)于自定義數(shù)據(jù)類型,set必須指定排序規(guī)則才可以插入數(shù)據(jù)

1.7 map/ multimap容器

1.7.1 map基本概念

  • map中所有元素都是pair
  • pair中第一個(gè)元素為key(鍵值),起到索引作用,第二個(gè)元素為value(實(shí)值)
  • 所有元素都會(huì)根據(jù)元素的鍵值自動(dòng)排序

本質(zhì):

  • map/multimap屬于關(guān)聯(lián)式容器,底層結(jié)構(gòu)是用二叉樹實(shí)現(xiàn)。

優(yōu)點(diǎn):

  • 可以根據(jù)key值快速找到value值

map和multimap區(qū)別

  • map不允許容器中有重復(fù)key值元素
  • multimap允許容器中有重復(fù)key值元素

1.7.2 map構(gòu)造和賦值

  • 對(duì)map容器進(jìn)行構(gòu)造和賦值操作

函數(shù)原型:

構(gòu)造:

  • map mp; //map默認(rèn)構(gòu)造函數(shù):
  • map(const map &mp); //拷貝構(gòu)造函數(shù)

賦值:

  • map& operator=(const map &mp); //重載等號(hào)操作符

示例:

#include void printMap(map&m){	for (map::iterator it = m.begin(); it != m.end(); it++)	{		cout << "key = " << it->first << " value = " << it->second << endl;	}	cout << endl;}void test01(){	mapm; //默認(rèn)構(gòu)造	m.insert(p           
               
                                           
                       
                 

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119115.html

相關(guān)文章

  • 一個(gè)腳本教你快速去除桌面圖標(biāo)煩人的小箭頭

    摘要:于是乎,冰河寫了一個(gè)腳本完美去除了桌面圖標(biāo)煩人的小箭頭。今天,給大家分享一個(gè)如何完美去除桌面快捷圖標(biāo)小箭頭的技巧,希望能夠給大家?guī)韼椭?。這種方法不會(huì)導(dǎo)致任何問題可放心使用,冰河已經(jīng)親自測(cè)試過了。 ...

    Jaden 評(píng)論0 收藏0
  • 從小白程序員一路晉升為大廠高級(jí)技術(shù)專家我看過哪些書籍?(建議收藏

    摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專家我看過哪些技術(shù)類書籍。 大家好,我是...

    sf_wangchong 評(píng)論0 收藏0
  • 爆肝1萬c++入門綜合》

    摘要:大家好,今天屁孩君給大家?guī)砣腴T綜合。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了語言的第一個(gè)國際標(biāo)準(zhǔn),該標(biāo)準(zhǔn)即為大名鼎鼎的。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了一份技術(shù)報(bào)告,詳細(xì)說明了計(jì)劃引入的新特性。年月日,經(jīng)過標(biāo)準(zhǔn)委員投票,標(biāo)準(zhǔn)獲得一致通過。 ...

    _Dreams 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<