摘要:拷貝構造函數(shù)示例構造無參構造函數(shù)總結容器和容器的構造方式幾乎一致,靈活使用即可賦值操作功能描述給容器進行賦值函數(shù)原型重載等號操作符將區(qū)間中的數(shù)據(jù)拷貝賦值給本身。清空容器的所有數(shù)據(jù)刪除區(qū)間的數(shù)據(jù),返回下一個數(shù)據(jù)的位置。
前段時間有粉絲問我,c++基礎學完了,不知道自己后面該繼續(xù)深入學習什么?C++進階要掌握那些知識點?
前幾天,我們已經整理了部分C++進階篇STL知識,C++進階篇STL容器string知識點,今天我們繼續(xù)來學習下STL其余常見容器,,一起來看看吧!
以下內容主要根據(jù)網上資料進行合并整理,如有侵權,請私信我。
功能:
vector與普通數(shù)組區(qū)別:
動態(tài)擴展:
功能描述:
函數(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;}
功能描述:
函數(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都可以
功能描述:
函數(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;}
總結:
功能描述:
函數(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;}
總結:
功能描述:
函數(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;}
總結:
功能描述:
函數(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可以使兩個容器互換,可以達到實用的收縮內存效果
功能描述:
函數(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預留空間
功能:
deque與vector區(qū)別:
deque內部工作原理:
deque內部有個中控器,維護每段緩沖區(qū)中的內容,緩沖區(qū)中存放真實數(shù)據(jù)
中控器維護的是每個緩沖區(qū)的地址,使得使用deque時像一片連續(xù)的內存空間
功能描述:
函數(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容器的構造方式幾乎一致,靈活使用即可
功能描述:
函數(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;}
功能描述:
函數(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;}
總結:
功能描述:
函數(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;}
總結:
功能描述:
函數(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;}
總結:
功能描述:
算法:
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;}
概念:stack是一種先進后出(First In Last Out,FILO)的數(shù)據(jù)結構,它只有一個出口
棧中只有頂端的元素才可以被外界使用,因此棧不允許有遍歷行為
棧中進入數(shù)據(jù)稱為 — 入棧 push
棧中彈出數(shù)據(jù)稱為 — 出棧 pop
功能描述:棧容器常用的對外接口
構造函數(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;}
總結:
概念:Queue是一種先進先出(First In First Out,FIFO)的數(shù)據(jù)結構,它有兩個出口
隊列容器允許從一端新增元素,從另一端移除元素
隊列中只有隊頭和隊尾才可以被外界使用,因此隊列不允許有遍歷行為
隊列中進數(shù)據(jù)稱為 — 入隊 push
隊列中出數(shù)據(jù)稱為 — 出隊 pop
功能描述:棧容器常用的對外接口
構造函數(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;}
總結:
**功能:**將數(shù)據(jù)進行鏈式存儲
鏈表(list)是一種物理存儲單元上非連續(xù)的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接實現(xiàn)的
鏈表的組成:鏈表由一系列結點組成
結點的組成:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結點地址的指針域
STL中的鏈表是一個雙向循環(huán)鏈表
由于鏈表的存儲方式并不是連續(xù)的內存空間,因此鏈表list中的迭代器只支持前移和后移,屬于雙向迭代器
list的優(yōu)點:
list的缺點:
List有一個重要的性質,插入操作和刪除操作都不會造成原有l(wèi)ist迭代器的失效,這在vector是不成立的。
總結:STL中List和vector是兩個最常被使用的容器,各有優(yōu)缺點
功能描述:
函數(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;}
功能描述:
函數(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;}
功能描述:
函數(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;}
總結:
功能描述:
函數(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;}
總結:
功能描述:
函數(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;}
總結:
功能描述:
函數(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;}
總結:
案例描述:將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ī)則制定,并不復雜
簡介:
本質:
set和multiset區(qū)別:
功能描述:創(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;}
功能描述:
函數(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;}
功能描述:
函數(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;}
功能描述:
函數(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;}
區(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 //對組創(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存放內置數(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ù)
本質:
優(yōu)點:
map和multimap區(qū)別:
函數(shù)原型:
構造:
map mp;
//map默認構造函數(shù):map(const map &mp);
//拷貝構造函數(shù)賦值:
map& operator=(const map &mp);
//重載等號操作符示例:
#include
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119115.html
摘要:于是乎,冰河寫了一個腳本完美去除了桌面圖標煩人的小箭頭。今天,給大家分享一個如何完美去除桌面快捷圖標小箭頭的技巧,希望能夠給大家?guī)韼椭_@種方法不會導致任何問題可放心使用,冰河已經親自測試過了。 ...
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級技術專家我看過哪些技術類書籍。 大家好,我是...
摘要:大家好,今天屁孩君給大家?guī)砣腴T綜合。年,標準委員會發(fā)布了語言的第一個國際標準,該標準即為大名鼎鼎的。年,標準委員會發(fā)布了一份技術報告,詳細說明了計劃引入的新特性。年月日,經過標準委員投票,標準獲得一致通過。 ...
閱讀 2193·2021-11-18 10:02
閱讀 3295·2021-11-11 16:55
閱讀 2698·2021-09-14 18:02
閱讀 2432·2021-09-04 16:41
閱讀 2064·2021-09-04 16:40
閱讀 1184·2019-08-30 15:56
閱讀 2219·2019-08-30 15:54
閱讀 3166·2019-08-30 14:15