国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

熬夜爆肝!C++核心STL容器知識點匯總整理【3W字干貨預警 建議收藏】

wayneli / 2431人閱讀

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

前言

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

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

以下內容主要根據(jù)網上資料進行合并整理,如有侵權,請私信我。

1 STL- 常用容器

1.1 vector容器

1.1.1 vector基本概念

功能:

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

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

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

動態(tài)擴展:

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

  • vector容器的迭代器是支持隨機訪問的迭代器

1.1.2 vector構造函數(shù)

功能描述:

  • 創(chuàng)建vector容器

函數(shù)原型:

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

案例:

#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);	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容器進行賦值

函數(shù)原型:

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

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

  • assign(n, elem); //將n個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);	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;}

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

1.1.4 vector容量和大小

功能描述:

  • 對vector容器的容量和大小操作

函數(shù)原型:

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

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

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

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

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

  • 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 重新指定大小 ,若指定的更大,默認用0填充新位置,可以利用重載版本替換默認填充	v1.resize(15,10);	printVector(v1);	//resize 重新指定大小 ,若指定的更小,超出部分元素被刪除	v1.resize(5);	printVector(v1);}int main() {	test01();	system("pause");	return 0;}

總結:

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

1.1.5 vector插入和刪除

功能描述:

  • 對vector容器進行插入、刪除操作

函數(shù)原型:

  • push_back(ele); //尾部插入元素ele
  • pop_back(); //刪除最后一個元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個元素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;}

總結:

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

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

功能描述:

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

函數(shù)原型:

  • at(int idx); //返回索引idx所指的數(shù)據(jù)
  • operator[]; //返回索引idx所指的數(shù)據(jù)
  • front(); //返回容器中第一個數(shù)據(jù)元素
  • back(); //返回容器中最后一個數(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的第一個元素為: " << v1.front() << endl;	cout << "v1的最后一個元素為: " << v1.back() << endl;}int main() {	test01();	system("pause");	return 0;}

總結:

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

1.1.7 vector互換容器

功能描述:

  • 實現(xià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;	//收縮內存	vector(v).swap(v); //匿名對象	cout << "v的容量為:" << v.capacity() << endl;	cout << "v的大小為:" << v.size() << endl;}int main() {	test01();	test02();	system("pause");	return 0;}

總結:swap可以使兩個容器互換,可以達到實用的收縮內存效果

1.1.8 vector預留空間

功能描述:

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

函數(shù)原型:

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

示例:

#include void test01(){	vector v;	//預留空間	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;}

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

1.2 deque容器

1.2.1 deque容器基本概念

功能:

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

deque與vector區(qū)別:

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

deque內部工作原理:

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

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

  • deque容器的迭代器也是支持隨機訪問的

1.2.2 deque構造函數(shù)

功能描述:

  • deque容器構造

函數(shù)原型:

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

示例:

#include void printDeque(const deque& d) {	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {		cout << *it << " ";	}	cout << endl;}//deque構造void test01() {	deque d1; //無參構造函數(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;}

**總結:**deque容器和vector容器的構造方式幾乎一致,靈活使用即可

1.2.3 deque賦值操作

功能描述:

  • 給deque容器進行賦值

函數(shù)原型:

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

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

  • assign(n, elem); //將n個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大小操作

功能描述:

  • 對deque容器的大小進行操作

函數(shù)原型:

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

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

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

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

  • 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)計大小		cout << "d1的大小為:" << d1.size() << endl;	}	//重新指定大小	d1.resize(15, 1);	printDeque(d1);	d1.resize(5);	printDeque(d1);}int main() {	test01();	system("pause");	return 0;}

總結:

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

1.2.5 deque 插入和刪除

功能描述:

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

函數(shù)原型:

兩端插入操作:

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

指定位置操作:

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

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

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

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

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

  • erase(pos); //刪除pos位置的數(shù)據(jù),返回下一個數(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;}

總結:

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

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

功能描述:

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

函數(shù)原型:

  • at(int idx); //返回索引idx所指的數(shù)據(jù)
  • operator[]; //返回索引idx所指的數(shù)據(jù)
  • front(); //返回容器中第一個數(shù)據(jù)元素
  • back(); //返回容器中最后一個數(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;}

總結:

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

1.2.7 deque 排序

功能描述:

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

算法:

  • sort(iterator beg, iterator end) //對beg和end區(qū)間內元素進行排序

示例:

#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是一種先進后出(First In Last Out,FILO)的數(shù)據(jù)結構,它只有一個出口

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

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

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

1.3.2 stack 常用接口

功能描述:棧容器常用的對外接口

構造函數(shù):

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

賦值操作:

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

數(shù)據(jù)存取:

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

大小操作:

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

示例:

#include //棧容器常用接口void test01(){	//創(chuàng)建棧容器 棧容器必須符合先進后出	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;}

總結:

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

1.4 queue 容器

1.4.1 queue 基本概念

概念:Queue是一種先進先出(First In First Out,FIFO)的數(shù)據(jù)結構,它有兩個出口

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

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

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

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

1.4.2 queue 常用接口

功能描述:棧容器常用的對外接口

構造函數(shù):

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

賦值操作:

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

數(shù)據(jù)存取:

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

大小操作:

  • 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)建隊列	queue q;	//準備數(shù)據(jù)	Person p1("唐僧", 30);	Person p2("孫悟空", 1000);	Person p3("豬八戒", 900);	Person p4("沙僧", 800);	//向隊列中添加元素  入隊操作	q.push(p1);	q.push(p2);	q.push(p3);	q.push(p4);	//隊列不提供迭代器,更不支持隨機訪問		while (!q.empty()) {		//輸出隊頭元素		cout << "隊頭元素-- 姓名: " << q.front().m_Name               << " 年齡: "<< q.front().m_Age << endl;        		cout << "隊尾元素-- 姓名: " << q.back().m_Name                << " 年齡: " << q.back().m_Age << endl;        		cout << endl;		//彈出隊頭元素		q.pop();	}	cout << "隊列大小為:" << q.size() << endl;}int main() {	test01();	system("pause");	return 0;}

總結:

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

1.5 list容器

1.5.1 list基本概念

**功能:**將數(shù)據(jù)進行鏈式存儲

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

鏈表的組成:鏈表由一系列結點組成

結點的組成:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結點地址的指針域

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

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

list的優(yōu)點:

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

list的缺點:

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

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

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

1.5.2 list構造函數(shù)

功能描述:

  • 創(chuàng)建list容器

函數(shù)原型:

  • list lst; //list采用采用模板類實現(xiàn),對象的默認構造形式:
  • list(beg,end); //構造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身。
  • list(n,elem); //構造函數(shù)將n個elem拷貝給本身。
  • list(const list &lst); //拷貝構造函數(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容器進行賦值,以及交換list容器

函數(shù)原型:

  • assign(beg, end); //將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。
  • assign(n, elem); //將n個elem拷貝賦值給本身。
  • list& operator=(const list &lst); //重載等號操作符
  • 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 大小操作

功能描述:

  • 對list容器的大小進行操作

函數(shù)原型:

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

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

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

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

  • 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;}

總結:

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

1.5.5 list 插入和刪除

功能描述:

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

函數(shù)原型:

  • push_back(elem);//在容器尾部加入一個元素
  • pop_back();//刪除容器中最后一個元素
  • push_front(elem);//在容器開頭插入一個元素
  • pop_front();//從容器開頭移除第一個元素
  • insert(pos,elem);//在pos位置插elem元素的拷貝,返回新數(shù)據(jù)的位置。
  • insert(pos,n,elem);//在pos位置插入n個elem數(shù)據(jù),無返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。
  • clear();//移除容器的所有數(shù)據(jù)
  • erase(beg,end);//刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個數(shù)據(jù)的位置。
  • erase(pos);//刪除pos位置的數(shù)據(jù),返回下一個數(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;}

總結:

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

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

功能描述:

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

函數(shù)原型:

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

示例:

#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;//錯誤 不支持at訪問數(shù)據(jù)	//cout << L1[0] << endl; //錯誤  不支持[]方式訪問數(shù)據(jù)	cout << "第一個元素為: " << L1.front() << endl;	cout << "最后一個元素為: " << L1.back() << endl;	//list容器的迭代器是雙向迭代器,不支持隨機訪問	list::iterator it = L1.begin();	//it = it + 1;//錯誤,不可以跳躍訪問,即使是+1}int main() {	test01();	system("pause");	return 0;}

總結:

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

1.5.7 list 反轉和排序

功能描述:

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

函數(shù)原型:

  • reverse(); //反轉鏈表
  • 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;}//反轉和排序void test01(){	list L;	L.push_back(90);	L.push_back(30);	L.push_back(20);	L.push_back(70);	printList(L);	//反轉容器的元素	L.reverse();	printList(L);	//排序	L.sort(); //默認的排序規(guī)則 從小到大	printList(L);	L.sort(myCompare); //指定規(guī)則,從大到小	printList(L);}int main() {	test01();	system("pause");	return 0;}

總結:

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

1.5.8 排序案例

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

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

示例:

#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("孫權", 40 , 170);	Person p4("趙云", 25 , 190);	Person p5("張飛", 35 , 160);	Person p6("關羽", 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;}
  • 對于自定義數(shù)據(jù)類型,必須要指定排序規(guī)則,否則編譯器不知道如何進行排序

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

1.6 set/ multiset 容器

1.6.1 set基本概念

簡介:

  • 所有元素都會在插入時自動被排序

本質:

  • set/multiset屬于關聯(lián)式容器,底層結構是用二叉樹實現(xiàn)。

set和multiset區(qū)別

  • set不允許容器中有重復的元素
  • multiset允許容器中有重復的元素

1.6.2 set構造和賦值

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

構造:

  • set st; //默認構造函數(shù):
  • set(const set &st); //拷貝構造函數(shù)

賦值:

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

示例:

#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);	//拷貝構造	sets2(s1);	printSet(s2);	//賦值	sets3;	s3 = s2;	printSet(s3);}int main() {	test01();	system("pause");	return 0;}
  • set容器插入數(shù)據(jù)時用insert
  • set容器插入數(shù)據(jù)的數(shù)據(jù)會自動排序

1.6.3 set大小和交換

功能描述:

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

函數(shù)原型:

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

示例:

#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)計大小 — size
  • 判斷是否為空 — empty
  • 交換容器 — swap

1.6.4 set插入和刪除

功能描述:

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

函數(shù)原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //刪除pos迭代器所指的元素,返回下一個元素的迭代器。
  • erase(beg, end); //刪除區(qū)間[beg,end)的所有元素 ,返回下一個元素的迭代器。
  • 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)計

功能描述:

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

函數(shù)原型:

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

示例:

#include //查找和統(tǒng)計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)計	int num = s1.count(30);	cout << "num = " << num << endl;}int main() {	test01();	system("pause");	return 0;}
  • 查找 — find (返回的是迭代器)
  • 統(tǒng)計 — count (對于set,結果為0或者1)

1.6.6 set和multiset區(qū)別

區(qū)別:

  • set不可以插入重復數(shù)據(jù),而multiset可以
  • set插入數(shù)據(jù)的同時會返回插入結果,表示插入是否成功
  • multiset不會檢測數(shù)據(jù),因此可以插入重復數(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;}
  • 如果不允許插入重復數(shù)據(jù)可以利用set
  • 如果需要插入重復數(shù)據(jù)利用multiset

1.6.7 pair對組創(chuàng)建

功能描述:

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

創(chuàng)建方式:

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

示例:

#include //對組創(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存放內置數(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);	//默認從小到大	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)	{		//按照年齡進行排序  降序		return p1.m_Age > p2.m_Age;	}};void test01(){	set s;	Person p1("劉備", 23);	Person p2("關羽", 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;}

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

1.7 map/ multimap容器

1.7.1 map基本概念

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

本質:

  • map/multimap屬于關聯(lián)式容器,底層結構是用二叉樹實現(xiàn)。

優(yōu)點:

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

map和multimap區(qū)別

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

1.7.2 map構造和賦值

  • 對map容器進行構造和賦值操作

函數(shù)原型:

構造:

  • map mp; //map默認構造函數(shù):
  • map(const map &mp); //拷貝構造函數(shù)

賦值:

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

示例:

#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; //默認構造	m.insert(p           
               
                                           
                       
                 

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119115.html

相關文章

  • 一個腳本教你快速去除桌面圖標煩人的小箭頭

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

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

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

    sf_wangchong 評論0 收藏0
  • 爆肝1萬c++入門綜合》

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

    _Dreams 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<