STL入門

STL入門

作者:blue

時間:2024.3

文章目錄

  • STL入門
    • 0.概述
    • 1.pair
    • 2.set(集合)
    • 3.vector
    • 4.string字符串類型
    • 5.queue,deque,priority_queue
    • 6.list的用法

0.概述

本文討論部分常用的STL的運用

1.pair

pair是將2個數據組合成一組數據,

pair的實現是一個結構體,主要的兩個成員變量是first second

pair<int ,double> p1;//注意中間要有逗號p1.first = 1;p1.second = 2.5;cout<<p1.first<<' '<<p1.second<<endl;//輸出結果:1 2.5

還可以利用make_pair創建新的pair對象:

pair<int, double> p1;
p1 = make_pair(1, 1.2);        //make_pair
cout << p1.first << p1.second << endl;//output: 1 1.2int a = 8;string m = "James";pair<int, string> newone;newone = make_pair(a, m);
cout << newone.first << newone.second << endl;//output: 8 James

通過tie獲取pair元素值

std::pair<std::string, int> getPreson() {return std::make_pair("Sven", 25);
}int main(int argc, char **argv) {std::string name;int ages;std::tie(name, ages) = getPreson();std::cout << "name: " << name << ", ages: " << ages << std::endl;return 0;
}

2.set(集合)

集合是存儲排序鍵的關聯容器,其中每個鍵都是唯一的,可以插入或刪除但不能更改。

begin()返回一個指向集合中第一個元素的迭代器
end()返回指向末尾的迭代器
empty()如果set為空,則返回true
insert()在集合中插入元素。
clear()刪除set容器中的所有的元素

初始化

template< class T,            class Compare = less<T>,    class Alloc = allocator<T>   > class set;

基本上就是三個參數,第一個是值,第二個比較器,用于比較內容,默認為less即降序,第三個是內存配置器,負責內存的分配和銷毀。

在實際使用中,我們僅僅為其分配值就足以滿足大部分需求。

set<int> s;    //直接指定值的類型創建,其他為默認方法
#include <iostream>
#include <set>
using namespace std;
int main()
{                   /*兩個‘>’之間最好有空格*/set<pair<double, double> > s;     //建立一個其中類型為pair<double,double>的集合,名為sint x1, y1, x2, y2;for (x1 = 0; x1 < 20; x1++){for (y1 = 0; y1 < 21; y1++){for (x2 = x1 + 1; x2 < 20; x2++){for (y2 = 0; y2 < 21; y2++){double k = double(x1 - x2) / (y1 - y2);double b = double(x2 * y1 - x1 * y2) / (x2 - x1);s.insert({ k,b });     //將元素值插入到集合s當中,集合會自動去重。}}}}printf("%lld", s.size() + 20);return 0;
}

set中元素的遍歷

關鍵是要聲明迭代器變量,遍歷方法與數組類似,可以用while循環也可以用for循環,但用for循環時條件運算符不能用 <,而用 != 進行判斷,還特別需要注意指針運算符

#include<iostream>
#include<set>
using namespace std;set<int>all;
int main()
{//生成待處理的數據for(int i=0;i<100;i++)all.insert(i);//遍歷set,用迭代器類型?????? 注意這種for(set<int>::iterator i=all.begin();i!=all.end();i++)cout<<*i<<endl; //注意指針運算符return 0;
}

3.vector

vector是一個十分有用的容器

簡單地說,vector是一個能夠*存放任意類型的動態數組*,能夠增加和壓縮數據。

實例:
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
signed main()
{int i;vector<int> a;           //定義for(i=0;i<=100;i++){a.push_back(i);      //尾部壓入}for(i=0;i<a.size();i++)   //把其當數組來遍歷 {printf("%lld ",a[i]);}reverse(a.begin(),a.end());   //逆轉容器中的值 printf("\n");                        //??,注意這里要用"!="for(vector<int>::iterator j=a.begin();j!=a.end();j++)  //把他用迭代器指針來遍歷 {//??注意迭代器調用,用指針printf("%lld ",*j);}return 0; 
}

運行結果

在這里插入圖片描述

排序

sort(vec.begin(),vec.end());(默認是按升序排列,即從小到大).bool cmp(int a,int b)
{return a>b;
}
調用時:sort(vec.begin(),vec.end(),Cmp),這樣就降序排序。

4.string字符串類型

C++ string中的find()函數 - 王陸 - 博客園 (cnblogs.com)

為什么 string.find()返回值是-1_string中find函數-1為什么是18446744073709551615-CSDN博客

兩篇文章結合著看

0順子日期 - 藍橋云課 (lanqiao.cn)

本題考查了對字符串類型的應用

#include <iostream>
#include <string>
using namespace std;
int main()
{int ans=0;string t1="012",t2="123";for(int i=1;i<=12;i++){for(int j=1;j<=31;j++){string str="2022";if(i>=10) str+=to_string(i);else{str+='0';str+=to_string(i);}if(j>=10) str+=to_string(j);else{str+='0';str+=to_string(j);}if(str.find(t1)!=-1||str.find(t2)!=-1) ans++;}}printf("%d",ans);return 0;
}

C++:cin、cin.getline()、getline()的用法_getline(cin,s)函數用法-CSDN博客

關于string,輸入帶空格或tab的字符串的有趣的用法。

C++中substr()函數用法詳解_c++ substr-CSDN博客

string的用法總讓人大吃一驚,還能這樣用?

 s.substr(pos, len)//string a=s.substr(0,3);s中從pos開始的len個字符的拷貝

5.queue,deque,priority_queue

隊列

queue<type> q
q.push(x) //將x放入隊列
q.front() //返回隊首元素但不刪除
q.pop()   //刪除隊首元素
q.back()  //返回隊尾元素
q.size()  //返回元素個數
q.empty() //檢查隊列是否為空,空則返回true

雙端隊列

由于雙端隊列,隊首隊尾都可以入隊與出隊的特點,他的入隊出隊操作與普通的queue不同,要格外注意

deque<type> dq
dp[i] //返回隊列中下標為i的元素
dq.front() //返回隊頭
dq.back()  //返回隊尾
dq.pop_back()//刪除隊尾,不返回值
dq.pop_front()//刪除隊頭,不返回值
dq.push_back(x)//在隊尾添加一個元素x
dq.push_front(x)//在隊頭添加一個元素x

雙端隊列的一個重要應用——單調隊列

①單調隊列與滑動窗口

#include <iostream>
#include <queue>
using namespace std;
int main()
{           //數組從下標1開始存儲,這個0是占位 int a[]={0,2,6,5,7,8,6};int m=3;//窗口的大小 deque<int> Q;//存放元素的下標 //滑動窗口的邊界為  [i-m+1,i] for(int i=1;i<=6;i++)  //維護窗口的最小值,保持隊首元素永遠是窗口內最小的 {while(!Q.empty()&&a[Q.back()]>a[i]) Q.pop_back();  //新進元素更優,隊尾出隊 Q.push_back(i);//存儲的是下標 if(Q.front()<i-m+1) Q.pop_front(); //隊首已在窗口之外,隊首出隊 if(i>=m) printf("%d ",a[Q.front()]);//窗口充滿,可以輸出 }printf("\n");for(int i=1;i<=6;i++) //維護窗口的最大值 {while(!Q.empty()&&a[Q.back()]<a[i]) Q.pop_back();Q.push_back(i);if(Q.front()<i-m+1) Q.pop_front();if(i>=m) printf("%d ",a[Q.front()]);} return 0;
}

優先隊列(priority_queue)

默認大頂堆

priority_queue <Type, Container, Functional> 隊列名 //類型,容器類型,比較方式priority_queue <int,vector<int>,greater<int> > q;//升序隊列(最小值優先)priority_queue <int,vector<int>,less<int> >q;    //降序隊列,最大值優先(默認的)

由于優先隊列是以堆的形式存儲數據的,所以隊首的元素應該是堆頂(top),這一點要和其他隊列區分開來

q.size();//返回q里元素個數
q.empty();//返回q是否為空,空則返回1,否則返回0
q.push(k);//在q的末尾插入k
q.pop();//刪掉q的第一個元素
q.top();//返回q的第一個元素

自定義優先級(要注意和自定義排序區分開,不要搞混了)

在這里插入圖片描述

結構體自定義優先級

在這里插入圖片描述

6.list的用法

詳解C++STL容器系列(二)—— list的詳細用法和與vector的對比_vector assign swap 區別-CSDN博客

掌握stl中list的用法

P1996 約瑟夫問題 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)

#include <iostream>
#include <list>
using namespace std;
int main()
{int n,m;cin>>n>>m;list<int> a;for(int i=1;i<=n;i++) a.push_back(i);list<int>::iterator it=a.begin();while(a.size()>1){for(int i=1;i<m;i++){it++;if(it==a.end()) it=a.begin();}cout<<*it<<" ";list<int>::iterator next=++it;if(next==a.end()) next=a.begin();//end()成員函數返回指向末尾位置的迭代器。這個“末尾位置”            指的是最后一個元素再往后一位,也就是說end()所指的位置不包含有效元素,它相當于一個虛設的節點。a.erase(--it);it=next;}cout<<*it;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73591.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷 P10463 Interval GCD Solution

Description 給定序列 a ( a 1 , a 2 , ? , a n ) a(a_1,a_2,\cdots,a_n) a(a1?,a2?,?,an?)&#xff0c;有 m m m 個操作分兩種&#xff1a; add ? ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k)&#xff1a;對每個 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 執行 …

從聲源定位(DOA)算法仿真到工程源碼實現-第八節

一、概述 本節我們記錄在respeaker core v2 開發板上部署一個完整的聲源定位(DOA)系統&#xff0c;演示可以看第一節中的視頻。整個模塊可以分為三部分&#xff0c;第一部分為控制開發板上的LED燈顯示&#xff0c;這樣可以實時的測試算法的效果&#xff1b;第二部分為從ALSA上取…

在linux部署網站

在Linux部署網站&#xff0c;需要準備一個純凈的系統 一、系統環境準備 1.設置靜態IP地址 ? 2.關閉默認防火墻 systemctl disable firewalld --now ? 3.配置SSH密鑰登錄 4.yum update -y && reboot # 更新系統內核 5.yum install -y wget curl unzip # 安裝…

Java后端API限流秘籍:高并發的防護傘與實戰指南

目錄導航 ?? ??? 為什么需要API限流??? 主流限流算法大解析????? 阿里巴巴的限流實踐?? 四大黃金定律?? 限流策略組合拳?? 限流場景實戰?? 技術實現方案?? 最佳實踐分享?? 結語與展望?? 推薦閱讀 1. ??? 為什么需要API限流? 在高并發環境中,未…

OpenGL ES 2.0與OpenGL ES 3.1的區別

如果硬件支持且需要更高質量的圖形效果&#xff0c;推薦3.1&#xff1b;如果兼容性和開發簡便更重要&#xff0c;且效果需求不高&#xff0c;2.0更合適。不過現代車載系統可能越來越多支持3.x版本&#xff0c;所以可能傾向于使用3.1&#xff0c;但具體情況還需調查目標平臺的硬…

k8s存儲介紹(五)PV與PVC

在 Kubernetes&#xff08;k8s&#xff09;中&#xff0c;持久化存儲&#xff08;Persistent Storage&#xff09;是一個非常重要的概念&#xff0c;因為 Pod 本身是無狀態的&#xff0c;重啟后會丟失數據。為了支持有狀態應用&#xff0c;Kubernetes 提供了持久化存儲的機制&a…

ORA-00600 [2662]

一、數據庫啟動報ORA-00600[2662] [oraclenode1 ora11g]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 22 14:37:00 2011Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to an idle instance.SQL> startup ORACLE instanc…

WebSocket接入SSL證書

目錄 碎碎念解決方法創建 HTTPS WebSocket 服務器創建系統服務啟動服務 碎碎念 在訪問網站時&#xff0c;使用 HTTPS 非常重要。HTTPS 協議不僅可以確保數據傳輸的安全性&#xff0c;還可以防止中間人攻擊和數據篡改等安全問題。任何沒有 SSL 證書的內容都可能會被拒絕訪問。因…

c#在work線程中怎樣更新UI控件

最近筆者調試修改項目&#xff0c;碰到了c#在work線程中怎樣更新UI控件中的場景&#xff0c;簡單總結了下&#xff0c;主要有兩個方法&#xff1a; 方法1&#xff1a;通過System.Windows.Application.Current.Dispatcher.Invoke來更新UI控件 System.Windows.Application.Curre…

?數據結構每日一題day3(順序表)★★★★★

題目描述&#xff1a;順序表L的元素遞增有序排列&#xff0c;設計一個算法在插入元素x后保持該順序表仍然遞增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想&#xff1a;在遞增有序的順序表中插入元素 x 并保持有序性&#xff0c;步驟如下&#xff1a; 合法…

MyBatis中mapper.xml 的sql映射規則

一、SQL 映射文件核心元素 MyBatis 映射文件的頂級元素&#xff08;按定義順序&#xff09;&#xff1a; cache&#xff1a;命名空間的緩存配置。cache-ref&#xff1a;引用其他命名空間的緩存。resultMap&#xff1a;自定義結果集映射。sql&#xff1a;可重用的 SQL 片段。i…

【計算機網絡】計算機網絡協議、接口與服務全面解析——結合生活化案例與圖文詳解

協議、接口與服務 導讀一、協議1.1 定義1.2 組成 二、接口三、服務3.1 定義3.2 服務與協議的區別3.3 分類3.3.1 面向連接服務于無連接服務3.3.2 可靠服務和不可靠服務3.3.3 有應答服務和無應答服務 結語 導讀 大家好&#xff0c;很高興又和大家見面啦&#xff01;&#xff01;…

Ubuntu服務器中Swapper如何與虛擬內存配合

在Ubuntu服務器中&#xff0c;Swapper和虛擬內存是操作系統中重要的概念&#xff0c;它們共同協作以提高系統的內存管理效率。當物理內存不足時&#xff0c;Swapper會幫助系統將不活躍的數據從內存轉移到磁盤上的交換空間(Swap)&#xff0c;以釋放內存給需要更多資源的進程。下…

SQL Server 中常見的數據類型及其詳細解釋、內存占用和適用場景

以下是 SQL Server 中常見的數據類型及其詳細解釋、內存占用和適用場景&#xff1a; 數據類型類別數據類型解釋內存占用適用場景整數類型bigint用于存儲范圍較大的整數&#xff0c;范圍是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字節需要…

vue數字公式篇 Tinymce結合使用(二)

繼上一篇的數字公式 &#xff0c; 這次的功能是將公式能插入編輯器以及修改 1、Tinymce 自定義 LateX 按鈕&#xff0c;打開公式編輯器窗口 LateX.vue window.tinymce.init({...//基礎配置這里我就不寫了setup(ed) {//自定義 LateX 按鈕ed.ui.registry.addButton(LateX, {text:…

python數據增強和轉換

數據增強和轉換 固定轉換隨機轉換概率控制的轉換 固定轉換 邊緣補充像素(Pad)尺寸變換(Resize)中心截取(CenterCrop)頂角及中心截取(FiveCrop)尺灰度變換(GrayScale) 概率控制的轉換 隨機垂直翻轉(RandomVerticalFlip)隨機應用(RandomApply) # -*- coding: utf-8 -*- fro…

Ubuntu下UEFI安全啟動安裝Nvdia驅動

簡介 眾所周知&#xff0c;Ubuntu默認使用Nouveau開源驅動&#xff0c;其性能受限&#xff0c;因此我們需要安裝Nvidia專用驅動。 安裝專用驅動的一般方法非常簡單&#xff0c;只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…

05_循環結構三目運算符

目錄 一、雙重for循環 練習 二、break關鍵字 三、continue 關鍵字 練習 四、三元運算 / 三目運算 一、雙重for循環 外層循環 循環一次&#xff0c;&#xff0c;&#xff0c;內層循環 循環一圈&#xff01;&#xff01;&#xff01; 循環里嵌套循環&#xff1a; for(var…

數據結構初階-二叉樹鏈式

目錄 1.概念與結構 2.二叉數鏈式的實現 2.1遍歷規則 2.2申請內存空間 2.3手動構建一棵二叉樹 2.4二叉樹結點的個數 2.5二叉樹葉子結點的個數 2.6二叉樹第K層結點個數 2.7二叉樹的高度 2.8二叉樹中查找值為x的結點 2.9二叉樹的銷毀 3.層序遍歷 3.1概念 3.2層序遍歷…

鴻蒙HarmonyOS NEXT之無感監聽

鴻蒙中存在一些無感監聽&#xff0c;這些監聽經過系統API封裝使用很簡單&#xff0c;但是對實際業務開發中有很重要&#xff0c;例如埋點業務、數據統計、行為上報、切面攔截等。 Navigation的頁面切換 在鴻蒙中Navigation被用來作為路由棧進行頁面跳轉&#xff0c;如果你想知…