主頁 >  其他 > STL 常用資料結構和演算法

STL 常用資料結構和演算法

2020-11-04 02:40:29 其他

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

int main(void)
{

    system("pause");
    return 0;
}

void test01()
{
    vector<int> v;
    //每一個容器都有自己的迭代器,迭代器是用來遍歷容器中的元素
	//v.begin()回傳迭代器,這個迭代器指向容器中第一個資料
	//v.end()回傳迭代器,這個迭代器指向容器元素的最后一個元素的下一個位置
	//vector<int>::iterator 拿到vector<int>這種容器的迭代器型別

    /* vector構造賦值

        vector<T> v;    //默認構造
        vector(v.begin(), v.end()); //將v[begin(), end()]中的元素拷貝本身
        vector(n, elem);    //建構式將n個elem拷貝給本身
        vector(const ventor &vec);  //拷貝建構式

        vector& operator=(const vector &vec);   //多載等號運算子
        assign(beg, end);   //將[beg, end]區間中的資料拷貝賦值給本身
        assign(n, elem);    //將n個elem拷貝賦值給本身
    */

    /* ventor容量和大小

        empty();    //判斷是否為空
        capacity(); //容器的容量
        size();     //元素個數
        resize(int num);   //重新指定容器長度為num, 若容器變長,以默認值指定新位置
        resize(int num, elem)   //重新指定,若變長,則以elem填充位置,變短則洗掉多余
    */

    /* vector插入洗掉

        push_back(ele);     //尾部插入元素ele
        pop_back();     //洗掉最后一個
        insert(const_iterator pos, ele);    //迭代器指向位置pos插入元素ele
        insert(const_iterator pos, int count, ele)  //迭代器指向位置pos插入count個ele
        erase(const_iterator pos);  //洗掉迭代器指向的元素
        erase(const_iterator start, const_iterator end);    //洗掉迭代器從start到end的元素
        clear();    //洗掉容器中的所有元素
    */

    /* vector資料存取

        at(int idx);    //回傳索引idx所指的資料
        operator[];     //回傳[]處的資料
        front();    //回傳容器中第一個資料元素
        back();     //回傳容器中最后一個資料元素
    */

    /* vector互換容器和預留空間
    
        swap(vec);  //將vec與本身的元素互換
        reserve(int len);   //容器預留len個元素長度,預留位置不初始化,元素不可訪問
    */
    v.push_back(1);
    v.push_back(2);
}

void test02()
{
    // 字串大小用size()

    /* 字串創建操作 

        string()    //創建一個空字串
        string(const char* s)    //使用字串s初始化
        string(const string& str)   //使用string物件初始化另一個string
        string(int n, char c)   //使用n個字符c初始化
    */

   /* 字串賦值操作

        string& operator = (const char *s);    //char*型別字串賦值給當前的字串
        string& operator = (const string &s);  //把字串s賦值給當前字串
        string& operator = (char c);    //把字符c賦值給當前字串
        string& assign(const char *s);  //把字串s賦給當前字串,
        string& assign(const char *s, int n);    //把字串s的前n個字符賦值給當前字串
        string& assign(const string &s);    //把當前字串s賦給當前字串
        string& assign(int n, char c);    //把n個字符賦值給當前字符
   */

    /* 字串拼接

            string& operator += (const char * str);   //多載+=運算子
            string& operator += (const char c);       //多載+=運算子
            string& operator += (const string &str);  //多載+=運算子
            string& append(const char *s);  //把字串連接到當前字串結尾
            string& append(const char *s, int n)    //把字串s的前n個字符連接到當前字串結尾
            string& append(const string &s)     //把字串s連接到末尾
            string& append(const string &s, int pos, int n);    //字串s中從pos開始的n個字串連接到字串末尾    
    */

    /* 字串查找替換

        * find查找是從左往后,rfind從右往左
        * find找到字串后回傳查找的第一個字符位置,找不到回傳-1
        * replace在替換時,要指定從哪個位置起,多少個字符,替換成什么樣的字串

        int find(const string &str, int pos = 0);  //查找str第一次出現的位置,從pos開始
        int find(const char* s, int pos = 0);   //查找s第一次出現的位置,從pos開始
        int find(const char* s, int pos = 0, int n);    //從pos開始查找s的前n個字符第一次位置
        int find(const char c, int pos = 0);    //查找字符c第一次出現的位置
        int rfind(const string& str, int pos = npos) const;  //查找str最后一次出現的位置,從pos開始找
        int rfind(const char* s, int pos = npos) const;  //查找s最后一次出現的位置,從pos開始
        int rfind(const char* s, int pos, int n) const;  //從pos查找s的前n個字符最后一次位置
        int rfind(const char c, int pos = 0) const;    //查找字符c最后一次出現的位置

        string& replace(int pos, int n, const string &str);   //替換從pos開始n個字符為字串str
        string& replace(int pos, int n, const char *s)    //替換從pos開始的n個字符為字串s
    */

   /* 字串比較存取
        按照字符的ascii碼進行對比,=回傳0,>回傳1,小于回傳-1
        int compare(const string &s) const;  //與字串s比較
        int compare(const char *s) const;   //與字串s比較

        char& operator[](int n);  //通過[]取字符
        char& at(int n);    //通過at()方法去字符
   */

    /* 字串插入洗掉

        string& insert(int pos, const char* s);  //插入字串
        string& insert(int pos, const string& str); //插入字串
        string& insert(int pos, int n, char c);  //在指定位置插入n個字符c
        string& erase(int pos, int n = npos);   //洗掉從Pos開始的n個字符
    */

    /* string子串

        string substr(int pos = 0, int n = npos) const; //回傳由pos開始的n個字符組成的字串
    */
    string s1;
}

void test03()
{
    /* deque與vector的區別:

        vector對于頭部的插入洗掉效率低,資料量越大,效率越低
        deque相對而言,對頭部的插入洗掉速度回比vector快
        vector訪問元素時的速度會比deque快,這和兩者內部實作有關
    */

    /* deque內部作業原理:

        deque內部有個中控器,維護每段緩沖區中的內容,緩沖區中存放真實資料
        中控器維護的是每個緩沖區的地址,使得使用deque時像一片連續的記憶體空間
        deque容器的迭代器也是支持隨機訪問的
    */

    /* 構造和賦值和vector一樣
        deque沒有容量的概念,其余和vector一樣
    */

    /* 插入洗掉
        比vector多了push_front(), pop_front();
    */
    
    /* 資料存取和vector一樣
    */

    /* deque排序---包含頭檔案<algorithm>

        sort(iterator beg, iterator end);   //對beg和end取鍵元素排序
    */
}

void test04()
{
    /* stack 容器

        建構式:
            stack<T> stk;   //stack采用模板實作,stack物件默認構造型別
            stack(const stack &stk);    //拷貝建構式
        賦值操作:
            stack& operator=(const stack &stk)  //多載等號運算子
        資料存取:
            push(elem); //向堆疊頂壓入元素
            pop();  //從堆疊頂取出元素
            top();  //回傳堆疊頂元素
        大小操作:
            empty();    //判斷堆疊是否為空
            size();     //回傳堆疊的大小

            
    */
}

void test05()
{
    /* queue容器

        建構式:
            queue<T> que;   //queue采用模板類實作,默認構造
            queue(const queue &que);    //拷貝構造
        賦值操作:
            queue& operator=(const queue &que); //多載等號
        資料存取:
            push(elem);     //往隊尾添加元素
            pop();          //從隊頭移除第一個元素
            back();         //回傳最后一個元素
            front();        //回傳第一個元素
        大小操作:
            empty();        //判斷堆疊是否為空
            size();         //回傳大小
    */
}

void test06()
{
    // list<int>::const_iterator
    /* list容器,鏈式存盤,構造

        list<T> lst;    //默認構造
        list(beg, end);     //建構式將[beg,end]中的元素拷貝
        list(n, elem);  //將n個elem拷貝本身
        list(const list &lst);  //拷貝建構式
    */

    /* 賦值交換

        assign(beg, end);   //將[beg,end)之間的資料拷貝
        assign(n, elem);    //將n個elem賦值
        list& operator=(const list &lst);   //多載=
        swap(lst);  //將lst于本身元素互換
    */

    /* 大小操作

        size(); //回傳元素個數
        empty();    //判斷是否空
        resize(num);   //重新指定長度為num
        resize(num, elem);  //多了以elem補全
    */

    /* 插入洗掉

        push_back(elem);    //在尾部加入一個元素
        pop_back();     //洗掉尾部最后一個元素
        push_front();   //在容器開頭插入一個元素
        pop_front();    //在容器開頭移除一個元素
        insert(pos, elem);  //在pos位置插elem元素的拷貝,回傳新資料的位置
        insert(pos, n, elem);  //在pos位置插入n個elem資料,無回傳值
        insert(pos, beg, end);  //在pos位置插入[beg, end]區間的資料,無回傳值
        clear();    //移除容器中所有資料
        erase(beg, end);
        erase(pos);
        remove(elem);   //洗掉容器中所有與elem值匹配的元素
    */

    /* 資料存取

        front();    //回傳第一個元素
        back();     //回傳最后一個元素
    */

    /* list反轉與排序
        reverse();  //反轉鏈表
        sort();     //鏈表排序
    */
}

void test07()
{
    /* set/multiset容器

        簡介:所有元素都會在插入時自動被排序
        關聯式容器,二叉樹實作
        set和multiset區別:
            set不允許容器中有重復的元素
            multiset允許容器中有重復的元素
            set插入資料的同時會回傳插入結果,表示插入是否成功
            multiset不會檢測資料,因此可以插入重復資料
    */

    /* set構造賦值

        set<T> st;  //默認建構式
        set(const set &set);    //拷貝建構式

        set& operator = (const set &st);    //多載=
    */

    /*
        set容器插入資料時用insert
        set容器插入資料時自動排序
        size();     //回傳元素數目
        empty();    //判斷容器是否為空
        swap();     //交換兩個集合容器
    */

    /* set插入洗掉   查找統計

        insert(elem);   //插入元素
        clear();    //清楚所有元素
        erase(pos);     //洗掉pos迭代器位置的元素,回傳下一個迭代器位置
        erase(beg, end) //洗掉區間元素,回傳下一個元素迭代器
        erase(elem)     //洗掉容器中值為elem的元素

        find(key);      //查找是否存在,回傳迭代器,不存在回傳set.end();
        count(key);     //統計key的元素個數
    */
}

void test08()
{
    /* pair對組創建

        功能描述:成對出現的資料,利用對組可以回傳兩個資料
    */

    /* 創建方式
        
        pair<type, type> p (value1, value2);
        pair<type, type> p = make_pair(value1, value2);

        p.first         //第一個元素
        p.second        //第二個元素

    */
}

void test09()
{
    /* map/ multimap容器
        map中所有元素都是成對出現,插入資料時候要使用對組

        簡介:
            map中所有元素都是pair
            pair中第一個元素為key(鍵值),起到索引作用,第二個元素為value(實值)
            所有元素都會根據元素的鍵值自動排序
            map/multimap屬于**關聯式容器**,底層結構是用二叉樹實作,
        優點:
            可以根據key值快速找到value值

        map和multimap的區別:
            map不允許容器中有重復key值元素
            multimap允許容器中有重復key值元素
    */

    /* map的構造賦值

        map<T1, T2> mp;
        map(const map &map);    

        map& operator = (const map &map);
    */

    /* map的大小和交換

        size();     //回傳元素數目
        empty();    //判空
        swap(st);   //交換兩個集合容器
    */

    /* 插入洗掉

        insert(elem);   //插入元素
        clear();        //清除所有元素
        erase(pos);     //洗掉pos所指的元素,回傳下一個迭代器
        erase(beg, end);
        erase(key);     //洗掉容器中值為key的元素
    */

     /* 查找統計

        find(key);      //查找key是否存在,回傳該鍵元素的迭代器,不存在,回傳set.end()
        count(key);     //統計key的元素的個數
     */
}

void test10()
{
    /* 常用遍歷演算法

        for_each()      //遍歷容器
        transform()     //搬運容器到另一個容器中
        transform(iterator beg1, iterator end1, iterator beg2, _func);
    */

    /* merge合并容器

        merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    */

    /* reverse將容器中的元素反轉

        reverse(iterator beg, iterator end);
    */

    /* 拷貝
        copy(iterator beg, iterator end, iterator dest);
    */
}

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

標籤:其他

上一篇:WordPress 網站使用 “微信機器人高級版” 插件連通微信公眾號

下一篇:1446. Consecutive Characters (E)

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

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more