八、C++STL 6大組件-你必知必會的編程利器

来源:https://www.cnblogs.com/woden3702/archive/2022/05/19/16288470.html
-Advertisement-
Play Games

來源:blog.csdn.net/qq_15371293/article/details/117090780 項目場景: ClickHouse 操作基於 Mybatis-puls源碼擴展開發。解決ClickHouse的修改和刪除 SQL操作與Mysql不相同。 基於 Mybatis-puls: up ...


STL這部分推薦直接看《C++ primer》的9到11章內容,有非常詳細的介面列表,還有很多例子。附錄里還有常用的泛型演算法,適合經常看一下

vector容器

底層數據結構:動態開闢的數組,每次以原來空間大小的2倍進行擴容的

vector<int> vec;

deque雙端隊列和list鏈表

初始的元素放在隊列的中間,方便後續添加元素。外部有一個mapper保存隊列,隊滿的時候會對mapper擴容,隊列放在擴容後的mapper的sizeof(原來mapper)/2的位置。

deque容器:

list容器

vector、deque、list對比

vecotr和deque之間的區別?

  • deque底層記憶體是否是連續的? 不是。deque是由一個二維數組構成的。每一個第二維是連續的,第一維數據不是連續的。
  • 前中後插入刪除的時間複雜度:中間和末尾是O(1),前面插入deque是O(1),vector是O(n)
  • 對於記憶體的使用效率: vector的低,需要的記憶體空間必須是連續的。deque可以分塊進行存儲,不需要記憶體空間必須是連續的。
  • 由於deque的第二維記憶體空間不是連續的,所以在deuqe中間進行元素的insert或者erase,造成元素移動的時候臂vector要慢

vector和list之間的區別?

  • list底層是雙向迴圈鏈表
  • list的增加刪除是O(1),vector增加刪除是O(n)

詳解容器適配器

無序關聯容器

unordered_set:

unordered_map:

map的operator[]重載有兩個功能:一是查詢,二如果key不存在,會插入一對數據

unordered_map<int,string> mp1;
mp1.insert(make_pair(12,"asf"));//生成pair類型
mp1.insert({123,"asfsaf"});

有序關聯容器

底層是紅黑樹結構。

自定義類型如何在有序容器中排序:要在自定義類型中提供小於運算符的重載

容器的迭代器

函數對象

函數對象就是C語言里的函數指針

把有operator()小括弧運算符重載函數的對象,稱作函數對象或者稱作仿函數。

好處:

  • 通過函數對象調用operator(),可以省略函數的調用開銷,比通過函數指針調用函數(不能夠inline內聯調用)效率高。
  • 因為函數對象使用類生成的,所以可以添加相關的成員變數,用來記錄函數對象使用時的更多的信息。
template<typename T>
bool mygreater(T a, T b) {
    return a > b;
}

template<typename T>
bool myless(T a, T b) {
    return a < b;
}

template<typename T>
class Myless{//函數對象
public:
    bool operator()(T a,T b){
        return a<b;
    }
};

template<typename T, typename Compare>
bool compare(T a, T b, Compare comp) {//使用函數指針或者函數對象調用前面定義的兩個函數
    return comp(a, b);//在使用函數指針的時候無法聲明為inline函數,效率低
}

int main() {
    cout << compare(10, 30, mygreater<int>)<<endl;
    cout<<compare(20,10,Myless<int>())<<endl;
    return 0;
}

函數對象的一些其他用法:用於priority_queue和set:

priority_queue<int,vector<int>,Mygreater<int>> queue1;
priority_queue<int> queue2;

for(int i=0;i<20;i++){
    queue1.push(rand()%100);
    queue2.push(rand()%100);
}

for(int i=0;i<20;i++){
    cout<<queue1.top()<<" ";
    queue1.pop();
}
cout<<endl;

for(int i=0;i<20;i++){
    cout<<queue2.top()<<" ";
    queue2.pop();
}
cout<<endl;

/* 輸出結果:
2 5 18 21 27 34 35 41 47 61 62 67 69 69 71 78 81 91 92 95
99 95 94 91 82 67 64 58 53 45 42 38 36 27 26 24 16 12 4 0*/

//set:
set<int> set1;
set<int,Mygreater<int>> set2;

for(int i=0;i<20;i++){
   set1.insert(rand()%100);
   set2.insert(rand()%100);
}

for(int a:set1){
    cout<<a<<" ";
}
cout<<endl;

for(int a:set2){
    cout<<a<<" ";
}
cout<<endl;

/* 輸出結果
3 6 16 22 23 29 37 40 41 46 47 53 62 64 70 73 88 90 93
78 68 64 59 57 50 48 44 42 41 35 33 29 11 6 5 1*/

泛型演算法和綁定器


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #Scanner對象 java.util.Scanner是java5的特征,可以通過Scanner類來獲取用戶的輸入。 基本語法: 通過Scanner類的next()與nextLine()方法獲取輸入的字元串,在讀取前一般需要使用hasNext()與hasNextLine()判斷是否還有輸入的數據。 ...
  • JSP:全拼寫:java Server pages:java 伺服器端頁面 可以理解為一個特殊的頁面:可以定義html代碼也可以定義java的代碼 定義:JSP是簡化Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一個文件中編寫,只對網頁中的要動態產生的內容採用Java代碼來編寫... ...
  • 卸載redis # 查詢redis進程 ps -ef | grep redis # 關閉進程 kill -9 6379 # 停止redis-cli redis-cli shutdown # 刪除local目錄下與redis相關的文件 rm -rf /usr/local/bin/redis-* 安裝r ...
  • 異常 異常定義 異常是運行過程中出現的錯誤 人為錯誤:填寫錯誤等 隨機錯誤:網路中斷、記憶體耗盡等 一個健壯的程式必須處理各種各樣的錯誤 Java的異常是class Object Throwable Error OutOfMemoryError Exception RuntimeException N ...
  • 一、反射 《java核心技術》 官方套話:能夠分析類能力的程式成為反射。 又通過網上搜索有這句話:反射指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。 反射是用來乾什麼的呢? “明明我自己能直接new一個對象,為什麼它要繞一個圈子,先拿到Class對象,再調用Class對象的方法來創建對象呢, ...
  • #包機制 包就是裝代碼的文件夾。 為了更好地組織類,JAVA提供了包機制,用於區別類名的組織空間。 ##package 包語句的句法格式為: 一般利用公司功能變數名稱倒置作為包名。 ##import 為了使用某個包的成員,需要在JAVA程式中明確導入該包。使用import語句可以完成此功能。 import必 ...
  • 轉自:https://www.evanlin.com/maglev/ 2016 年 6 月 2 日 前言(為什麼想讀這一篇論文) 這一篇論文吸引我註意的原因是,Consistent Hashing本來的特性就是作為分散式緩存之用。谷歌將他們的負載均衡器(代號:Maglev)發佈他的實作方式,裡面將一 ...
  • 文章已收錄至https://lichong.work,轉載請註明原文鏈接。 ps:歡迎關註公眾號“Fun肆編程”或添加我的私人微信交流經驗🤝 一.Nginx安裝配置及常用命令 1.環境搭建 首先在linux系統下安裝gcc編譯環境,執行: yum install gcc-c++ -y 確保當前系統 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...