C++?STL容器與函數(shù)謂詞示例分析講解
C++ STL(Standard Template Library標(biāo)準(zhǔn)模板庫(kù)),相當(dāng)于java的集合模塊, STL 有很多的容器。
1.C++ vector向量
(內(nèi)部:封裝動(dòng)態(tài)大小數(shù)組作為容器,能夠存放任意的動(dòng)態(tài)數(shù)組)
#include <iostream> #include <vector> // 引入 vector 容器的支持 // NDK 開發(fā) 一定要用容器 應(yīng)該 queue 隊(duì)列 using namespace std; int main() { vector<int> vector1; vector<int> vector2(10); // 指定10的空間大小 vector<int> vector3(10, 0); // 有了10個(gè)值了 每個(gè)值都是0 vector<int> vector4; // 插入數(shù)據(jù) vector4.insert(vector4.begin(), 40); vector4.insert(vector4.begin(), 60); vector4.insert(vector4.begin(), 80); // 第一個(gè) cout << " 修改前:vector4.front():" << vector4.front() << endl; vector4.front() = 99; // 默認(rèn)修改第一個(gè) cout << " 修改后:vector4.front():" << vector4.front() << endl; // 最后一個(gè) cout << " 修改前:vector4.back():" << vector4.back() << endl; vector4.back() = 777; // 默認(rèn)修改最后 cout << " 修改后:vector4.back():" << vector4.back() << endl; vector4.erase(vector4.begin()); // 移除第一個(gè)元素(內(nèi)部:通過迭代器的位置 進(jìn)行移除) 刪除 // 循環(huán)打印,默認(rèn) 從大到小輸出 for (int i = 0; i < vector4.size(); ++i) { cout << "item:" << vector4[i] << endl; } // 迭代器 循環(huán)遍歷 // auto Kotlin自帶類型推到 // for (vector<int>::iterator iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) { for (auto iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) { // 迭代器 當(dāng)中指針操作 iteratorVar++ cout << "迭代器:" << *iteratorVar << endl; } cout << "" << endl; return 0; }
- vector4.begin() 迭代器 插入到前面
- vector4.end() 迭代器 插入到后面
2.C++ stack 棧
#include <stack> using namespace std; int main() { stack<int> stackVar; stackVar.push(30); stackVar.push(60); stackVar.push(90); while (!stackVar.empty()) { int top = stackVar.top(); // top == 獲取棧頂?shù)脑? cout << "獲取棧頂?shù)脑兀? << top << endl; // 永遠(yuǎn)拿 90 stackVar.pop(); // 把棧頂?shù)脑?彈出去 【刪除】 } return 0; }
棧沒有迭代器,不能指定位置壓棧等
3.C++ queue 隊(duì)列
#include <queue> using namespace std; int main() { queue<int> queueVar; queueVar.push(20); queueVar.push(40); queueVar.push(60); // 第一個(gè)元素 cout << " 修改前: queueVar.front():" << queueVar.front() << endl; queueVar.front() = 88; cout << " 修改后: queueVar.front():" << queueVar.front() << endl; // 最后一個(gè) cout << " 修改前: queueVar.back():" << queueVar.back() << endl; queueVar.back() =99; cout << " 修改后: queueVar.back():" << queueVar.back() << endl; while (!queueVar.empty()) { cout << "while1:" << queueVar.front() << endl; queueVar.pop(); // 把前面的元素 給消費(fèi)掉 【刪除】 } return 0; }
queue隊(duì)列內(nèi)部是通過數(shù)組和鏈表實(shí)現(xiàn)的,這個(gè)數(shù)據(jù)結(jié)構(gòu)應(yīng)用場(chǎng)景比較多,音視頻編解碼啥的都會(huì)用到,遵守FIFO 原則。
4.優(yōu)先級(jí)隊(duì)列
#include <iostream> #include <queue> using namespace std; int main() { // priority_queue<int> priorityQueue; priority_queue<int ,vector<int>, less<int>> priorityQueue; priorityQueue.push(10); priorityQueue.push(20); priorityQueue.push(30); priorityQueue.push(100); priorityQueue.push(50); priorityQueue.push(60); cout << priorityQueue.top() << endl; // 60 // 循環(huán)代碼 while (!priorityQueue.empty()) { cout << "while1:" << priorityQueue.top() << endl; priorityQueue.pop(); // 最前面的元素消費(fèi)掉 } return 0; }
- priority_queue 內(nèi)部對(duì)我們前面的vector 有一定的封裝
- 優(yōu)先級(jí)隊(duì)列會(huì)自動(dòng)進(jìn)行排序操作
- priority_queue priorityQueue:這樣聲明優(yōu)先級(jí)隊(duì)列,相當(dāng)于priority_queue<int ,vector, less> priorityQueue,省略了比較策略等
- less return __x < __y: 從大到小
- greater return __x > __y: 從小到大
5.C++ list
#include <iostream> #include <list> using namespace std; int main() { list<char*> listVar; // 插入操作 listVar.push_front("唐三"); // 插入到前面 明確 listVar.push_back("小舞"); // 插入到后面 listVar.insert(listVar.begin(),"寧榮榮"); // 插入到前面 靈活 listVar.insert(listVar.end(), "馬紅俊"); // 插入到后面 // // 修改操作 // listVar.back() = 88; // listVar.front() = 55; // // 刪除 // listVar.erase(listVar.begin()); // 刪除最前面的 55 // listVar.erase(listVar.end()); // 刪除最后面的 88 for (auto it = listVar.begin(); it != listVar.end() ; it ++) { cout << *it << endl; } return 0; }
- Java:ArrayList采用Object[]數(shù)組, C++的list 內(nèi)部:采用鏈表
- 不用通過角標(biāo)去訪問、修改 、遍歷
6.c++ set 集合
#include <iostream> #include <set> using namespace std; int main() { set<int, less<int>> setVar; setVar.insert(1); setVar.insert(3); setVar.insert(2); setVar.insert(4); pair<set<int, less<int>>::iterator, bool> res = setVar.insert(4); bool insert_success = res.second; if (insert_success) { cout << "插入成功" << endl; } else { cout << "插入失敗" << endl; } for (auto it = setVar.begin(); it != setVar.end() ; it ++) { cout << *it << endl; } return 0; }
- set(內(nèi)部:紅黑樹結(jié)構(gòu)),會(huì)對(duì)你存入的數(shù)據(jù)進(jìn)行排序,不允許元素相同
- __x < __y 從小到大,默認(rèn)情況下 就是 less
- 添加參數(shù),不需要用迭代器,也不需要指定位置
- 重復(fù)插入,會(huì)提示插入失敗
7.C++ map函數(shù)
#include <iostream> #include <map> using namespace std; int main() { // 注意:map會(huì)對(duì)key進(jìn)行排序,默認(rèn) key不能重復(fù) map<int, string> mapVar; // TODO 添加數(shù)據(jù) // 第一種方式 mapVar.insert(pair<int, string>(1, "唐三")); // 第二種方式 mapVar.insert(make_pair(2, "小舞")); // 第三種方式 mapVar.insert(map<int, string>::value_type (3, "寧榮榮")); // 上面三種方式 key不能重復(fù) // 思考:既然會(huì)對(duì)key進(jìn)行排序,那么key是不能重復(fù)的(會(huì)插入失?。? std::pair<map<int,string>::iterator ,bool> r=mapVar.insert(pair<int, string>(3, "寧榮榮2")); // 注意這個(gè)方式是插入失敗了 //通過pair的方式 if (r.second){ cout << "插入成功" << endl; }else{ cout << "插入失敗" << endl; } // 第四種方式 mapVar[key]=Value mapVar[4] = "馬紅俊"; mapVar[4] = "比比東"; // 第四種方式覆蓋/替換(常用) /** * typedef typename _Rep_type::iterator iterator; 之前常規(guī)的迭代器 typedef typename _Rep_type::const_iterator const_iterator; 只讀的,只能讀,不能修改 的迭代器 typedef typename _Rep_type::reverse_iterator reverse_iterator; 倒序打印的迭代器 */ // 循環(huán)打印,迭代器 for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) { cout << it->first << "," << it->second.c_str() << "\t"; } cout << endl; // 查找,操作 map<int, string> ::iterator findResult = mapVar.find(3); // 查找 if (findResult != mapVar.end()) { cout << "恭喜,找到了" << findResult->first << "," << findResult->second.c_str() << endl; } else { cout << "沒找到了" << endl; } //刪除元素 mapVar.erase(5); //如果刪除的元素不存在 也不會(huì)報(bào)錯(cuò) // 循環(huán)打印,迭代器 for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) { cout << it->first << "," << it->second.c_str() << "\t"; } cout << endl; return 0; }
- 通過pair 插入數(shù)據(jù)如果id重復(fù)會(huì)插入失敗,不會(huì)覆蓋
- 通過mapVar[4] = "馬紅俊"這個(gè)方式插入數(shù)據(jù),如果id重復(fù)會(huì)進(jìn)行覆蓋
- 通過erase函數(shù)刪除元素,如果id不存在不會(huì)報(bào)錯(cuò)
8.C++ multimap容器
#include <iostream> #include <map> using namespace std; int main() { multimap<int, string> multimapVar; multimapVar.insert(make_pair(10, "十個(gè)1")); multimapVar.insert(make_pair(10, "十個(gè)2")); multimapVar.insert(make_pair(10, "十個(gè)3")); multimapVar.insert(make_pair(30, "三十1")); multimapVar.insert(make_pair(30, "三十3")); multimapVar.insert(make_pair(30, "三十2")); multimapVar.insert(make_pair(20, "二十1")); multimapVar.insert(make_pair(20, "二十2")); multimapVar.insert(make_pair(20, "二十3")); for (auto iteratorVar = multimapVar.begin(); iteratorVar != multimapVar.end() ; iteratorVar ++) { cout << iteratorVar->first << "," << iteratorVar->second << endl; } cout << endl; int result; cout << "請(qǐng)輸入你要查詢的key,為int類型:" << endl; cin >> result; multimap<int, string>::iterator iteratorVar = multimapVar.find(result); while (iteratorVar != multimapVar.end()) { cout << iteratorVar->first << "," << iteratorVar->second << endl; iteratorVar++; if (iteratorVar->first != result) { break;; } // if (iteratorVar == multimapVar.end()) { // break; // } } return 0; }
- multimap核心功能是分組
- multimap key可以重復(fù),key重復(fù)的數(shù)據(jù)可以分組,key會(huì)自動(dòng)進(jìn)行排序
9.C++ 謂詞
c++ 謂詞 概念: 返回bool類型的仿函數(shù)稱為謂詞 。
如果operator()接受一個(gè)參數(shù),那么叫做一元謂詞 如果operator()接受兩個(gè)參數(shù),那么叫做二元謂詞。
#include <iostream> #include <set> using namespace std; class Person { public: string name; int id; Person(string name, int id) : name(name), id(id) {} }; // 自定義謂詞 (仿函數(shù)) struct doCompareAction2 { public: bool operator() (const Person& __x, const Person& __y) { return __x.id < __y.id; } }; struct doCompareAction3 { public: bool operator() (const Person& __x, const Person& __y) { return __x.id > __y.id; } }; int main() { set<Person, doCompareAction2> setVar; // set<Person, doCompareAction3> setVar; // 構(gòu)建對(duì)象 Person p1 ("Snake", 1); Person p2 ("kevin", 2); Person p3 ("Derry", 3); // 把構(gòu)建的對(duì)象 插入到 set 容器里面去 setVar.insert(p1); setVar.insert(p2); setVar.insert(p3); for (set<Person>::iterator it = setVar.begin(); it != setVar.end() ; it ++) { cout << it->name.c_str() << " , " << it->id << endl; } return 0; }
- c++ Set集合,默認(rèn)的謂詞不能對(duì)對(duì)象類型的比較,如果set集合傳入對(duì)象類型需要自定義謂詞來處理
- 謂詞定義的規(guī)則:定義一個(gè)結(jié)構(gòu)體,bool operator() 這部分是固定格式 參數(shù)部分是兩個(gè)常量引用類型數(shù)據(jù),返回比較兩個(gè)對(duì)象的維度就可以
10.C++內(nèi)置預(yù)定義函數(shù)
// C++ 預(yù)定義函數(shù)(C++ 內(nèi)置函數(shù)) #include <iostream> using namespace std; int main() { // "Derry" + "AAAA" // 運(yùn)算符重載 // C++已經(jīng)提供了 預(yù)定義函數(shù) plus,minus,multiplies,divides,modulus ... plus<int> add_func; int r = add_func(1, 1); cout << r << endl; plus<string> add_func2; string r2 = add_func2("AAAA", "BBB"); cout << r2 << endl; plus<float> add_func3; float r3 = add_func3(4354.45f, 34.3f); cout << r3 << endl; return 0; }
到此這篇關(guān)于C++ STL容器與函數(shù)謂詞示例分析講解的文章就介紹到這了,更多相關(guān)C++ STL容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 二叉搜索樹(BST)的實(shí)現(xiàn)方法
這篇文章主要介紹了C++ 二叉搜索樹(BST)的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2017-04-04C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02用C實(shí)現(xiàn)添加和讀取配置文件函數(shù)
本篇文章是對(duì)用C語言實(shí)現(xiàn)添加和讀取配置文件函數(shù)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Visual Studio 2019修改編碼UTF-8的實(shí)現(xiàn)
這篇文章主要介紹了Visual Studio 2019修改編碼UTF-8的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C++實(shí)現(xiàn)中綴轉(zhuǎn)后綴的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)中綴轉(zhuǎn)后綴的問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法
這篇文章主要介紹了Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法,重點(diǎn)講解了圖標(biāo)的繪制技巧,需要的朋友可以參考下2016-04-04