摘要:拷貝構(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)私信我。
功能:
vector與普通數(shù)組區(qū)別:
動(dòng)態(tài)擴(kuò)展:
功能描述:
函數(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;}
功能描述:
函數(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都可以
功能描述:
函數(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é):
功能描述:
函數(shù)原型:
示例:
#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é):
功能描述:
函數(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é):
功能描述:
函數(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)存效果
功能描述:
函數(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ù)留空間
功能:
deque與vector區(qū)別:
deque內(nèi)部工作原理:
deque內(nèi)部有個(gè)中控器,維護(hù)每段緩沖區(qū)中的內(nèi)容,緩沖區(qū)中存放真實(shí)數(shù)據(jù)
中控器維護(hù)的是每個(gè)緩沖區(qū)的地址,使得使用deque時(shí)像一片連續(xù)的內(nèi)存空間
功能描述:
函數(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)造方式幾乎一致,靈活使用即可
功能描述:
函數(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;}
功能描述:
函數(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é):
功能描述:
函數(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é):
功能描述:
函數(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é):
功能描述:
算法:
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;}
概念:stack是一種先進(jìn)后出(First In Last Out,FILO)的數(shù)據(jù)結(jié)構(gòu),它只有一個(gè)出口
棧中只有頂端的元素才可以被外界使用,因此棧不允許有遍歷行為
棧中進(jìn)入數(shù)據(jù)稱為 — 入棧 push
棧中彈出數(shù)據(jù)稱為 — 出棧 pop
功能描述:棧容器常用的對(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é):
概念: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
功能描述:棧容器常用的對(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é):
**功能:**將數(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):
list的缺點(diǎn):
List有一個(gè)重要的性質(zhì),插入操作和刪除操作都不會(huì)造成原有l(wèi)ist迭代器的失效,這在vector是不成立的。
總結(jié):STL中List和vector是兩個(gè)最常被使用的容器,各有優(yōu)缺點(diǎn)
功能描述:
函數(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;}
功能描述:
函數(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;}
功能描述:
函數(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é):
功能描述:
函數(shù)原型:
示例:
#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é):
功能描述:
函數(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é):
功能描述:
函數(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é):
案例描述:將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ù)雜
簡介:
本質(zhì):
set和multiset區(qū)別:
功能描述:創(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;}
功能描述:
函數(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;}
功能描述:
函數(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;}
功能描述:
函數(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;}
區(qū)別:
示例:
#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;}
功能描述:
創(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;}
示例一: 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ù)
本質(zhì):
優(yōu)點(diǎn):
map和multimap區(qū)別:
函數(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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119115.html
摘要:于是乎,冰河寫了一個(gè)腳本完美去除了桌面圖標(biāo)煩人的小箭頭。今天,給大家分享一個(gè)如何完美去除桌面快捷圖標(biāo)小箭頭的技巧,希望能夠給大家?guī)韼椭?。這種方法不會(huì)導(dǎo)致任何問題可放心使用,冰河已經(jīng)親自測(cè)試過了。 ...
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專家我看過哪些技術(shù)類書籍。 大家好,我是...
摘要:大家好,今天屁孩君給大家?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)獲得一致通過。 ...
閱讀 2199·2021-11-18 10:02
閱讀 3302·2021-11-11 16:55
閱讀 2705·2021-09-14 18:02
閱讀 2442·2021-09-04 16:41
閱讀 2076·2021-09-04 16:40
閱讀 1200·2019-08-30 15:56
閱讀 2222·2019-08-30 15:54
閱讀 3172·2019-08-30 14:15