網站首頁 編程語言 正文
C++ STL(Standard Template Library標準模板庫),相當于java的集合模塊, STL 有很多的容器。
1.C++ vector向量
(內部:封裝動態大小數組作為容器,能夠存放任意的動態數組)
#include <iostream>
#include <vector> // 引入 vector 容器的支持
// NDK 開發 一定要用容器 應該 queue 隊列
using namespace std;
int main() {
vector<int> vector1;
vector<int> vector2(10); // 指定10的空間大小
vector<int> vector3(10, 0); // 有了10個值了 每個值都是0
vector<int> vector4;
// 插入數據
vector4.insert(vector4.begin(), 40);
vector4.insert(vector4.begin(), 60);
vector4.insert(vector4.begin(), 80);
// 第一個
cout << " 修改前:vector4.front():" << vector4.front() << endl;
vector4.front() = 99; // 默認修改第一個
cout << " 修改后:vector4.front():" << vector4.front() << endl;
// 最后一個
cout << " 修改前:vector4.back():" << vector4.back() << endl;
vector4.back() = 777; // 默認修改最后
cout << " 修改后:vector4.back():" << vector4.back() << endl;
vector4.erase(vector4.begin()); // 移除第一個元素(內部:通過迭代器的位置 進行移除) 刪除
// 循環打印,默認 從大到小輸出
for (int i = 0; i < vector4.size(); ++i) {
cout << "item:" << vector4[i] << endl;
}
// 迭代器 循環遍歷
// auto Kotlin自帶類型推到
// for (vector<int>::iterator iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
for (auto iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
// 迭代器 當中指針操作 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 == 獲取棧頂的元素
cout << "獲取棧頂的元素:" << top << endl; // 永遠拿 90
stackVar.pop(); // 把棧頂的元素 彈出去 【刪除】
}
return 0;
}
棧沒有迭代器,不能指定位置壓棧等
3.C++ queue 隊列
#include <queue>
using namespace std;
int main() {
queue<int> queueVar;
queueVar.push(20);
queueVar.push(40);
queueVar.push(60);
// 第一個元素
cout << " 修改前: queueVar.front():" << queueVar.front() << endl;
queueVar.front() = 88;
cout << " 修改后: queueVar.front():" << queueVar.front() << endl;
// 最后一個
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(); // 把前面的元素 給消費掉 【刪除】
}
return 0;
}
queue隊列內部是通過數組和鏈表實現的,這個數據結構應用場景比較多,音視頻編解碼啥的都會用到,遵守FIFO 原則。
4.優先級隊列
#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
// 循環代碼
while (!priorityQueue.empty()) {
cout << "while1:" << priorityQueue.top() << endl;
priorityQueue.pop(); // 最前面的元素消費掉
}
return 0;
}
- priority_queue 內部對我們前面的vector 有一定的封裝
- 優先級隊列會自動進行排序操作
- priority_queue priorityQueue:這樣聲明優先級隊列,相當于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[]數組, C++的list 內部:采用鏈表
- 不用通過角標去訪問、修改 、遍歷
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(內部:紅黑樹結構),會對你存入的數據進行排序,不允許元素相同
- __x < __y 從小到大,默認情況下 就是 less
- 添加參數,不需要用迭代器,也不需要指定位置
- 重復插入,會提示插入失敗
7.C++ map函數
#include <iostream>
#include <map>
using namespace std;
int main() {
// 注意:map會對key進行排序,默認 key不能重復
map<int, string> mapVar;
// TODO 添加數據
// 第一種方式
mapVar.insert(pair<int, string>(1, "唐三"));
// 第二種方式
mapVar.insert(make_pair(2, "小舞"));
// 第三種方式
mapVar.insert(map<int, string>::value_type (3, "寧榮榮"));
// 上面三種方式 key不能重復
// 思考:既然會對key進行排序,那么key是不能重復的(會插入失敗)
std::pair<map<int,string>::iterator ,bool> r=mapVar.insert(pair<int, string>(3, "寧榮榮2")); // 注意這個方式是插入失敗了
//通過pair的方式
if (r.second){
cout << "插入成功" << endl;
}else{
cout << "插入失敗" << endl;
}
// 第四種方式 mapVar[key]=Value
mapVar[4] = "馬紅俊";
mapVar[4] = "比比東"; // 第四種方式覆蓋/替換(常用)
/**
* typedef typename _Rep_type::iterator iterator; 之前常規的迭代器
typedef typename _Rep_type::const_iterator const_iterator; 只讀的,只能讀,不能修改 的迭代器
typedef typename _Rep_type::reverse_iterator reverse_iterator; 倒序打印的迭代器
*/
// 循環打印,迭代器
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); //如果刪除的元素不存在 也不會報錯
// 循環打印,迭代器
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 插入數據如果id重復會插入失敗,不會覆蓋
- 通過mapVar[4] = "馬紅俊"這個方式插入數據,如果id重復會進行覆蓋
- 通過erase函數刪除元素,如果id不存在不會報錯
8.C++ multimap容器
#include <iostream>
#include <map>
using namespace std;
int main() {
multimap<int, string> multimapVar;
multimapVar.insert(make_pair(10, "十個1"));
multimapVar.insert(make_pair(10, "十個2"));
multimapVar.insert(make_pair(10, "十個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 << "請輸入你要查詢的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可以重復,key重復的數據可以分組,key會自動進行排序
9.C++ 謂詞
c++ 謂詞 概念: 返回bool類型的仿函數稱為謂詞 。
如果operator()接受一個參數,那么叫做一元謂詞 如果operator()接受兩個參數,那么叫做二元謂詞。
#include <iostream>
#include <set>
using namespace std;
class Person {
public:
string name;
int id;
Person(string name, int id) : name(name), id(id) {}
};
// 自定義謂詞 (仿函數)
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;
// 構建對象
Person p1 ("Snake", 1);
Person p2 ("kevin", 2);
Person p3 ("Derry", 3);
// 把構建的對象 插入到 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集合,默認的謂詞不能對對象類型的比較,如果set集合傳入對象類型需要自定義謂詞來處理
- 謂詞定義的規則:定義一個結構體,bool operator() 這部分是固定格式 參數部分是兩個常量引用類型數據,返回比較兩個對象的維度就可以
10.C++內置預定義函數
// C++ 預定義函數(C++ 內置函數)
#include <iostream>
using namespace std;
int main() {
// "Derry" + "AAAA" // 運算符重載
// C++已經提供了 預定義函數 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;
}
原文鏈接:https://blog.csdn.net/u014078003/article/details/126290349
相關推薦
- 2022-03-23 深入淺析OpenCV?copyTo()函數_C 語言
- 2022-05-08 ASP.NET?MVC擴展HtmlHelper方法_實用技巧
- 2022-08-28 C++實現貪心算法的示例詳解_C 語言
- 2023-07-31 elementui中el-tabs切換實時更新數據
- 2023-05-29 postgresql數據庫配置文件postgresql.conf,pg_hba.conf,pg_id
- 2023-01-18 解讀Scrapy回調函數callback傳遞參數的方式_python
- 2022-11-04 C++多態特性之派生與虛函數與模板詳細介紹_C 語言
- 2022-07-21 react 高價組件HOC實現組件復用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支