主頁 > 後端開發 > 關于STL容器的簡單總結

關于STL容器的簡單總結

2023-05-29 07:43:38 後端開發

關于STL容器的簡單總結

1、結構體中多載運算子的示例

//結構體小于符號的多載
struct buf { 
   int a,b;
   bool operator < (const buf& c1) const {  //注意:第二個const一定不能少
   return a<c1.a;
   }
};
//或
struct foo {
    int a,b;
};
bool operator < (const foo &x, const foo &y)
{return x.a < y.a;}

2、佇列(queue)

#include <queue>
queue<int>a;    //定義 
a.push(x);      //壓入 
a.pop();      //彈出 
a.size();   //取大小 
a.front();    //訪問隊首元素 
a.back();     //訪問隊尾元素 
a.empty();    //判斷佇列是否為空

3、優先佇列(priority_queue)

#include <queue>
priority_queue<int,vector<int>,greater<int> > c;      //定義從小到大的int型別的優先佇列
priority_queue<int> c;                                //定義從大到小的int型別的優先佇列 
c.push();        //壓入 
c.pop();         //彈出隊首元素 
c.top();         //訪問隊首元素 
c.empty();       //判斷佇列是否為空
//如是結構體必須多載'<' 

4、雙端佇列(deque)

#include <deque>
deque <int> b;    //定義雙端佇列 
b.push_front(x); //在隊首壓入元素 
b.push_back(x);  //在隊尾壓入元素 
b.pop_front();   //彈出隊首元素 
b.pop_back();    //彈出隊尾元素 
b.size();        //取大小 
b.back();        //訪問隊尾元素
b.front();       //訪問隊首元素 
b.empty();       //判斷佇列是否為空
//可用[]訪問

5、堆疊(stack)

#include <stack>
stack<int> d;    //定義 
d.push(x);       //壓入元素 
d.pop();         //彈出堆疊頂元素 
d.top();         //訪問堆疊頂元素 
d.size();        //取大小 
d.empty();       //判斷堆疊是否為空

6、 集合(set)

#include <set>
set<int> e;
e.insert(i);     //插入元素 
e.erase(i);      //洗掉值為i的元素 
e.count(i);      //查看值為i的元素是否存在 
e.empty();       //判斷set是否為空
set<int>:: iterator rit;        //定義迭代器 
rit = (e.insert(j)).first    //回傳插入后元素對應的迭代器
rit=e.find(i);       //回傳值為i的元素的迭代器,如果沒找到回傳的是e.end()
rit=e.lower_bound(i)  //回傳值大于等于i的第一個元素的迭代器, 如果沒有大于等于i的元素回傳e.end()
rit=e.upper_bound(i)  //回傳值大于i的第一個元素的迭代器, 如果沒有大于i的元素回傳e.end()
for(rit=e.begin();rit!=e.end();rit++)   //正序遍歷,值為*rit
set<int>::reverse_iterator rit;         //反向遍歷的迭代器 
for(rit=e.rbegin();rit!=e.rend();rit++) //反向遍歷必須這么寫 
注: 不能直接寫e.erase(e.rbegin());
//如使用結構體,必須多載< 或寫仿函式

7、可重集(multiset)

#include <set>
multiset<int> e;
e.insert(i);     //插入元素 
e.erase(i);      //洗掉所有值為i的元素 
e.erase(e.find(i)) //洗掉一個值為i的元素
e.count(i);      //統計值為i的元素的數量
e.empty();       //判斷multiset是否為空
multiset<int>:: iterator rit;        //定義迭代器 
rit = (e.insert(j)).first    //回傳插入后元素對應的迭代器
rit=e.find(i);       //回傳第一個值為i的元素的迭代器,如果沒找到回傳的是e.end()
rit=e.lower_bound(i)  //回傳值大于等于i的第一個元素的迭代器, 如果沒有大于等于i的元素回傳e.end()
rit=e.upper_bound(i)  //回傳值大于i的第一個元素的迭代器, 如果沒有大于i的元素回傳e.end()
for(rit=e.begin();rit!=e.end();rit++)   //正序遍歷,值為*rit
set<int>::reverse_iterator rit;         //反向遍歷的迭代器 
for(rit=e.rbegin();rit!=e.rend();rit++) //反向遍歷必須這么寫 
//如使用結構體,必須多載< 或寫仿函式
注: 如希望用多種不同排序方式對set/multiset內元素進行排序, 則應該多載運算子, 寫成仿函式形式:

struct t {
    int a, b, c;
};
struct cmp1
{
    bool operator () (const t &x, const t &y)
    {return x.a < y.a;}
};
struct cmp2
{
    bool operator () (const t &x, const t &y)
    {return x.b < y.b;}
};
struct cmp3
{
    bool operator () (const t &x, const t &y)
    {return x.c < y.c;}
};
set <t, cmp1> st;
set <t, cmp2> st2;
set <t, cmp3> st3;

8、map

#include <map>
map<string,int> f; //定義一個map,其中string是鍵值(就像一個人的名字一樣)的型別,int是值的型別,可以隨便換, 鍵值需要多載 <,
f[s]=d;  //把一個鍵值為s,值為d的元素 插入到此map中或覆寫原有映射(因為map多載了[]所以可以直接這樣寫) 
f.count(s); //統計鍵值為s的元素的個數,因為在map中鍵值是排好序的集合,所以count()的回傳值不是1就是0 
f.erase(s);            //刪掉鍵值是s的元素 
f.size();              //取大小
f.empty();             //判斷map是否為空
map<string,int>:: iterator rit;    //定義map的迭代器 ,遍歷的時候可能會用到 
rit=f.find(s);                     //回傳鍵值為s的元素的迭代器 
rit->second;            //迭代器為s映射的值,如把second改成first則是s 
//查詢可以直接用[] 
//map就像一個完美的哈希表,但內部由紅黑樹實作, 因此操作復雜度均為O(log(n)),有了map媽媽再也不用擔心查找資料了!

9、vector

#include <vector>
vector <int> vec;             //定義一個vector, 內部元素型別為int,
vector <int>::iterator it;    //定義vector<int> 的迭代器
vec.push_back(i)              //向vec后面加入元素i
vec.push_front(i)             //向vec前面加入元素i
vec.begin()                   //回傳vec的第一個元素對應的迭代器, 如果為慷訓傳vec.end()
vec.size()                    //回傳vector內的元素個數
vec.erase(it)                 //洗掉it對應元素, 同時后面的元素整體前移一位, 注: 復雜度為O(N)
vec.clear()                   //清空vec, 但不釋放記憶體
vector <int>().swap(vec)      //清空vec并釋放記憶體(若卡記憶體,多組資料的題推薦這樣清零)

10、sort()

#include <algorithm>
vector <int> vec;
sort(vec.begin(), vec.end());//vector的sort方式
int a[105];
sort(a, a + 105);//將整個a陣列從小到大排序
double b[1005];
bool cmp (double c, double d)//自定義排序方法
{return c > d;}
sort(b + 1, b + 1 + 1000, cmp)//將b[1] ~ b[1000]的元素從大到小排序

11、二分查找

注:lower_bound和upper_bound  使用前提均為原序列有序!

#include <algorithm>
int a[1005], pos;
int *b;
b = lower_bound(a + 1, a + 1001, i)   //回傳a[1] ~ a[1000]第一個大于等于i的元素的指標, 若沒有則回傳a[1001]的指標
b = upper_bound(a + 1, a + 1001, i)   //回傳a[1] ~ a[1000]第一個大于i的元素的指標, 若沒有則回傳a[1001]的指標
pos = b - a;                          //得到其下標
vector <int> vec;
vector <int>::iterator it;            
it = lower_bound(vec.begin(), vec.end(), i)  //回傳vec中第一個大于等于i的元素的迭代器, 若沒有則回傳vec.end()
it = upper_bound(vec.begin(), vec.end(), i)  //回傳vec中第一個大于i的元素的迭代器, 若沒有則回傳vec.end()
set <int> st;
set <int>::iterator it;
it = st.lower_bound(st.begin(), st.end(), i)  //回傳st中第一個大于等于i的元素的迭代器, 若沒有則回傳st.end()
it = st.lower_bound(st.begin(), st.end(), i)  //回傳st中第一個大于i的元素的迭代器, 若沒有則回傳st.end()

12、reverse()

#include <algorithm>
int a[105];
reverse(a + 1, a + 1 + 100);          //將a[1] ~ a[100]及其之間的元素前后翻轉
vector <int> vec;
reverse(vec.begin(), vec.end())       //前后翻轉整個vec里面的元素

13、bitset

//bitset可以當bool陣列用, 但其內部為unsigned int壓位而成, 支持左右移, 賦值, 清零等操作, 01背包用bitset優化可以做到O(N^2/32)
#include <bitset>
bitset <1005> bt;                       //宣告一個大小為1005的bitset
bt[0] = 1;                              //將bt[0]設為1
int a;
a = bt.count();                         //回傳bt中1的個數
bt.reset();                             //將bt所有位清零
bt.set();                               //將bt所有位設為1
bt.flip();                              //將bt所有位異或1
bt.flip(i);                             //將bt第i位翻轉
bt = bt | (bt << 1)                     //將bt的第i位與第i + 1位取或, 復雜度為O(N/32)
bt = bt ^ (bt >> 2)                     //將bt的第i位和第i - 2位異或, 復雜度為O(N/32)

14、__builtin_系列

//以下函式復雜度均為O(1)
int a = __builtin_popcount(233)              //回傳233二進制位上1的個數
int b = __builtin_ffs(666)                   //回傳666二進制位從低向高第一個1的位置
int c = __builtin_ctz(19260817)              //回傳19260817二進制位后綴0的個數
//注: 以上函式所傳變數默認均為unsigned int, 若要傳long long 請在后面加上"ll",
例如: int d = __builtin_popcountll(1000000000000ll);
轉自http://ybt.ssoier.cn:8087

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553631.html

標籤:其他

上一篇:樹莓派使用HC-SR04超聲波測距

下一篇:返回列表

標籤雲
其他(159859) Python(38178) JavaScript(25460) Java(18141) C(15232) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7214) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5343) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4577) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1948) C++(1924) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 關于STL容器的簡單總結

    # 關于STL容器的簡單總結 ## 1、結構體中多載運算子的示例 ``` //結構體小于符號的多載 struct buf { int a,b; bool operator queuea; //定義 a.push(x); //壓入 a.pop(); //彈出 a.size(); //取大小 a.fro ......

    uj5u.com 2023-05-29 07:43:38 more
  • 樹莓派使用HC-SR04超聲波測距

    ### 超聲波模塊介紹 超聲波測距原理很簡單: 1、通過記錄發送超聲波的時間、記錄超聲波回傳的時間,回傳時間與發送時間相減得到超聲波的持續時間。 2、通過公式:(**超聲波持續時間** * **聲波速度**) / **2**就可以得出距離; ![image.png](https://img2023. ......

    uj5u.com 2023-05-29 07:43:26 more
  • Python 使用ConfigParser操作ini組態檔

    ini 組態檔格式如下 要求:ini 檔案必須是GBK編碼,如果是UTF-8編碼,python讀取組態檔會報錯。 # 這里是注釋內容 # [FY12361] #婦幼保健介面服務埠 serverIP=192.168.1.11 serverPort=8400 [SM] #國產SM加密服務埠 se ......

    uj5u.com 2023-05-29 07:42:39 more
  • Python asyncio之協程學習總結

    ## 實踐環境 Python 3.6.2 ## 什么是協程 **協程**(Coroutine)一種電腦程式組件,該程式組件通過允許暫停和恢復任務,為非搶占式多任務生成子程式。**協程**也可以簡單理解為協作的程式,通過協同多任務處理實作并發的函式的變種(一種可以支持中斷的函式)。 下面,我們通過日常 ......

    uj5u.com 2023-05-29 07:42:28 more
  • 【python基礎】基本資料型別-字串型別

    # 1.初識字串 字串就是一系列字符。在python中,用引號括起來文本內容的都是字串。 其語法格式為:‘文本內容’或者“文本內容” 我們發現其中的引號可以是單引號,也可以是雙引號。這樣的靈活性可以使我們進行引號之間的嵌套。 撰寫程式如下所示: ![image](https://img2023 ......

    uj5u.com 2023-05-29 07:42:08 more
  • Python 標準類別庫-因特網資料處理之Base64資料編碼

    該模塊提供將二進制資料編碼為可列印ASCII字符并將這種編碼解碼回二進制資料的功能。它為[RFC 3548](https://tools.ietf.org/html/rfc3548.html)中指定的編碼提供編碼和解碼功能。定義了Base16、Base32和Base64演算法,以及事實上的標準Asci ......

    uj5u.com 2023-05-29 07:41:52 more
  • 樹莓派使用HC-SR04超聲波測距

    ### 超聲波模塊介紹 超聲波測距原理很簡單: 1、通過記錄發送超聲波的時間、記錄超聲波回傳的時間,回傳時間與發送時間相減得到超聲波的持續時間。 2、通過公式:(**超聲波持續時間** * **聲波速度**) / **2**就可以得出距離; ![image.png](https://img2023. ......

    uj5u.com 2023-05-29 07:41:37 more
  • 計算機網路面試八股文

    ## 網路分層結構 計算機網路體系大致分為三種,OSI七層模型、TCP/IP四層模型和五層模型。一般面試的時候考察比較多的是五層模型。最全面的Java面試網站:[最全面的Java面試網站](https://topjavaer.cn) ![](http://img.topjavaer.cn/img/t ......

    uj5u.com 2023-05-29 07:40:44 more
  • Java的Object類的方法

    Java的Object類是所有類的根類,它提供了一些通用的方法。下面是一些常用的Object類方法: 1. equals(Object obj):判斷當前物件是否與給定物件相等。默認情況下,equals方法比較的是物件的參考,但可以通過在具體類中重寫equals方法來改變其比較行為。 2. hash ......

    uj5u.com 2023-05-29 07:40:14 more
  • Java 網路編程 —— 創建非阻塞的 HTTP 服務器

    ## HTTP 概述 HTTP 客戶程式必須先發出一個 HTTP 請求,然后才能接收到來自 HTTP 服器的回應,瀏覽器就是最常見的 HTTP 客戶程式。HTTP 客戶程式和 HTTP 服務器分別由不同的軟體開發商提供,它們都可以用任意的編程語言撰寫。HTTP 嚴格規定了 HTTP 請求和 HTTP ......

    uj5u.com 2023-05-29 07:40:09 more