玩轉C++容器中的查找功能——自定義對象

2020-12-27 軟體技術分享

C++標準中std提供了幾種容器,它們包括順序容器,比如vector, list, deque, queue, stack等,關聯容器 ,比如map, set等,其中使用頻率比較高的容器是vecotor向量容器、map鍵值對容器,我們經常會使用這兩個容器來存儲數據,然後根據不同的場景來查找獲取容器內的值。而本文接下來將說明從這兩類容器中快速查找獲取數據的方法。

一、vector容器查找功能

vector容器自身沒有提供查找函數,這裡藉助標準模版庫algorithm提供的find, 使用的時候需要包含該頭文件。

首先定義vector容器變量,然後存入數據,接著遍歷列印容器內的所有數據,最後調用algorithm提供的函數find從vector向量中查找數據,algorithm提供的函數find需要輸入三個入參數,第一個參數是容器開始查找的迭代器變量,第二個變量是容器結束查找的迭代器變量,第三個參數是需要查找的數據。

運行程序,輸出的內容如下圖所示,容器內存在需要查找的數據,返回迭代器變量,我們根據迭代器變量輸出數據內容

二、map容器查找功能

map容器自身提供了查找功能,同時它也支持使用標準模版庫algorithm提供的find函數。

首先定義map容器變量,寫入數據,再遍歷輸出容器內的數據,接著調用map容器自身提供的find函數來查找key為2的數據,返回迭代器變量,然後根據這個迭代器變量輸出鍵值,接下來調用algorithm提供的find函數,需要注意的是第三個參數輸入的是迭代器的取值,最後也是返回迭代器變量。

運行程序,輸出的內容如下圖所示

三、鍵自定義的map容器查找功能

map容器使用過程中,有時候為了程序的可維護性以及降低代碼的複雜度,需要自定義類作為map的鍵,在這種場景下,上面的查找方法是否也能夠生效呢?接下來讓我們進行驗證。

首先自定義類JKeyPair來作為map的key, 如果自定義對象要作為map的鍵,那麼需要重載operator<運算符,而如果要使用algorithm中的find,需要重載operator==運算符

驗證調用map自身提供的find函數,其測試代碼如下圖所示

從運行的結果看,使用自定義對象作為key值,map容器提供的find函數能夠正確運行,並且從實際操作過程中,可以得出,map容器提供的find函數,自定義對象不需要重載operator==運算符。

接著再驗證algorithm中的find,從實際操作過程中,自定義對象需要重載operator==運算符,測試代碼段如下圖所示,其中find中第三個參數是上一步驟中調用map自身的find返回的迭代器變量

運行後列印的結果信息看,能夠正確調用algorithm中的find來查找map中的數據

四、總結

到這裡,我們已經將容器vector,map的查找功能介紹完成。接下來梳理總結。vector容器自身沒有提供查找函數,因此,需要調用algorithm中的find來快速查找數據。map容器自身既提供了查找函數,也支持使用algorithm中的find來快速查找數據。而自定義對象作為map容器的鍵的情況下,如果需要支持上面的場景,那麼自定義類需要重載operator<和operator==運算符。

相關焦點

  • C++隨機排序容器中的元素
    作者:apocelipes連結:https://www.cnblogs.com/apocelipes/p/10351335.html在各種程序語言中都提供了將容器元素隨機排序的shuffle方法,c++也不例外。
  • 「最佳實踐」C++陷阱與套路
    本文轉載自【微信公眾號:碼磚雜役,ID:whatis9527want】# 一、導語C++是一門被廣泛使用的系統級程式語言,更是高性能後端標準開發語言;C++雖功能強大,靈活巧妙,但卻屬於易學難精的專家型語言
  • 跟我學C++中級篇——STL的學習
    一、c++標準庫C++的標準庫主要包含兩大類,首先是包含C的標準庫的,當然,為了適應c++對一些C庫進行了少許的修改和增加。最重要的當然是面向對象的c++庫;而c++庫又可以分成兩大類,即面向對象的c++庫和標準模板庫,也就是題目中的STL。
  • C++(STL):02---tuple容器
    :如果兩個容器具有相同大小且所有元素都兩兩對應相等,則兩容器相等;否則不相等如果兩個容器大小不相同,但較小容器中每個元素都等於較大容器中對應元素,則較小容器小於較大容器如果兩個容器都不是另一個容器的前綴子序列,則它們的比較結果取決於第一個不相等元素的比較結果tuple與STL容器的比較規則類似,但是:只有兩個tuple具有相同數量的成員時才可以進行比較
  • C++ 的門門道道 | 技術頭條 - CSDN
    結論:如果全局變量有依賴關係,那麼就把它們放在同一個源文件定義,且按正確的順序定義,確保依賴關係正確,而不是定義在不同源文件;對於系統中的單件,單件依賴也要注意這個問題。二、編譯器為什麼不給局部變量和成員變量做默認初始化?
  • 常用的C++ STL查找算法
    《effective STL》中有句忠告,儘量用算法替代手寫循環;查找少不了循環遍歷,在這裡總結下常用的STL查找算法;查找有三種,即點線面:點就是查找目標為單個元素;線就是查找目標為區間;面就是查找目標為集合;針對每個類別的查找,默認的比較函數是相等,為了滿足更豐富的需求,算法也都提供了自定義比較函數的版本
  • C++ 優先隊列priority_queue
    這三個參數的含義分別為:數據類型,容器類型和比較函數,實際上優先隊列就是維護了一個裝有 T 類型元素的容器 Container,並在入隊和出隊時對容器內元素使用 Compare 比較函數進行了排序。這3個參數還要滿足一定的要求,並且在使用過程中有些注意事項:1.
  • java中的自定義註解
    今天準備把Java中的自定義註解分享一下子,因為好多小夥伴,貌似都不知道註解這個東西到底是什麼,只知道怎麼用,卻不知道註解的底層原理。Java中的註解概述首先要說明一個東西,註解這個東西絕對不是Spring為我們提供的,而是JDK帶的,JDK自己也是有很多內置註解的,比如@override. 註解的功能其實就是為一些加了註解的類,方法等賦予特殊的含義,具體如何產生自定義的含義,其實就是註解處理器了,這是下一篇和大家講的.
  • c++11新特性,所有知識點都在這了!
    +11引入default特性,多數時候用於聲明構造函數為默認構造函數,如果類中有了自定義的構造函數,編譯器就不會隱式生成默認構造函數,如下代碼:struct A { int a; A(int i) { a = i; }};int main() { A a; return 0;}
  • Excel中如何添加自定義函數到函數庫
    那麼該如何進行自定義函數,自定義的函數如何添加到函數庫,並對其添加必要的使用說明,使其更像內置函數呢?下面以自定義WLOOKUP函數為例,為讀者詳細講解。WLOOKUP自定義函數其實是INDEX和MATCH函數嵌套函數,實現的是查找匹配值功能,與微軟新出的XLOOKUP函數功能一致,但XLOOKUP函數只有Office 365和Excel2019版本中有,所以自定義WLOOKUP函數主要是為低版本Excel提供XLOOKUP函數功能。
  • ​跟我學C++中級篇——STL的容器vector
    一、順序容器vectorC++程式設計師中,如果用到過STL,那麼一定肯定用過vector,這個是最常見,最初步的一個數據類型。上一篇提到的array遠遠比不上它。畢竟那玩意兒相對vector是很久遠後才提出來的。在這之前,std::vector承擔了多少小菜鳥處理數組各種問題的最優選方法。不用處理內存,可以刪除,任意增加不考慮越界。那簡直是一種最單純質樸的快樂。
  • 70道C語言與C++常見問答題
    數組做sizeof的參數不退化,傳遞給strlen就退化為指針了6 C 語言的關鍵字 static 和 C++ 的關鍵字 static 有什麼區別在 C 中 static 用來修飾局部靜態變量和外部靜態變量、函數。而 C++中除了上述功能外,還用來定義類的成員變量和函數。即靜態成員和靜態成員函數。
  • C++機器學習庫介紹
    首先,我們將製作用於存儲CSV文件中的值的數據容器:Data<RealVector> inputs; //存儲x值的容器Data<RealVector> labels; //存儲y值的容器接下來,我們需要導入它們。
  • C++ 順序容器基礎知識總結
    所以本文僅僅是對容器基礎知識的歸納。至於容器提供的接口與使用實例,建議查取官方文檔。文章難免有錯漏,希望指出。1、容器概論容器,置物之所也。像桶可裝水,碗可盛湯,C++的容器,可以存儲對象。容器有多種,用來處理不同的元素操作訴求。按照元素存儲到容器中以及訪問方式的差異,容器分為順序容器與關聯容器。順序容器也稱為序列式容器。
  • json for modern c++的使用
    3.使用c++11標準編寫。4.使用json 像使用STL容器一樣。5.STL和json容器之間可以相互轉換。…如何使用?將github上的src文件夾裡的json.hpp頭文件下載保存到當前目錄中。在代碼中包含json.hpp頭文件並引入json作用域#include "json.hpp"using json = nlohmann::json;常用功能:一.創建json對象1.使用cin,cout輸入輸出流。json提供了cin,cout的輸入輸出流的操作符。
  • EXCEL自定義函數實例-查找指定數據,並返回多個與其對應的數據
    自定義函數使用示範使用EXCEL肯定對函數不陌生,比如求和函數SUM,EXCEL內置了很多實用的函數,但有時候這些函數也不能滿足我們的使用要求,這時我們可以創建屬於自己的函數,這就叫自定義函數現在演示的這個自定義函數類似於Vlookup,但Vlookup只能返回查找區域右邊某一列的數據。不能返回左邊的,也不能返回多個數據。這個自定義函數是可以返回左邊對應數據及自身的。如果返回多個數據會把多個數據以逗號隔開連接在一起。
  • c++的輸入與輸出
    c++輸入與輸出C++ 標準庫提供了一組豐富的輸入/輸出功能,本章將討論 C++ 編程中最基本和最常見的 I/O 操作。輸入輸出並不是c++語言的正式組成成分,c和c++沒有為輸入輸出提供專門的結構。在c語言中輸入輸出是通過調用scanf和printf 實現的,在c++中是通過調用流對象cin和cout實現的。
  • C++ initializer_list 詳解
    ,用於可讓我們列表初始化容器,自定義的函數,自定義的類中的構造函數,要在代碼中使用initializer_list必須包含頭文件initializer_list,這個模板很簡單,包含成員函數 begin(),end(),size(),可以使用這些函數去遍歷列表元素。
  • 淺談C++下STL庫中的容器底層小知識
    可是對於在大廠面試過程中,STL庫中各種容器底層數據結構以及相關實現細節也是常問的知識點,今天就帶大家小小梳理一番STL中的常見容器下的一些小知識吧,希望能對大家有所幫助。比如二分查找方法lower_bound和upper_bound就是一大利器。
  • C 語言會比 C++ 快?
    該算法需要一個自定義實現的哈希表和一個排序例程。我們將看一下實現的幾個變化過程,首先是從使用 C ++ 容器和算法的變化開始,這將有助於該算法,然後一次刪除一個 C ++ 特性並測試編譯速度和運行時的性能。