八、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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...