C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解
面試模擬
某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第21面:
面試官:用過(guò)STL嗎?
二師兄:(每天都用好嗎。。)用過(guò)一些。
面試官:你知道STL是什么?
二師兄:STL是指標(biāo)準(zhǔn)模板庫(kù)(Standard Template Library
),是C++區(qū)別于C語(yǔ)言的特征之一。
面試官:那你知道STL的六大部件是什么?
二師兄:分別是容器(container
)、迭代器(iterator
)、適配器(adaptor
)、分配器(allocator
)、仿函數(shù)(functor
)和算法(algorithm
)。
面試官:那你知道有哪些容器嗎?
二師兄:STL中容器的數(shù)量比較多,按照類(lèi)型可以分為順序容器和關(guān)聯(lián)容器。
二師兄:順序容器主要有vector
、deque
、list
、forward_list
和array
。其中forward_list
和array
是C++11引入的。
二師兄:關(guān)聯(lián)容器主要有set
、map
、multiset
、multimap
、unordered_set
、unordered_map
、unordered_multiset
、unordered_multiamp
。其中后四種是C++11新引入的。
面試官:好的。那你知道迭代器分為哪些種類(lèi)嗎?
二師兄:分別是輸入迭代器(Input Iterator
)、輸出迭代器(Output Iterator
)、前向迭代器(Forward Iterator
)、雙向迭代器(Bidirectional Iterator
)和隨機(jī)訪問(wèn)迭代器(Random Access Iterator
)。
二師兄:其中輸入和輸出迭代器分別用于讀取和寫(xiě)入數(shù)據(jù),前向迭代器只能向前訪問(wèn)而不能向后訪問(wèn)(forward_list
),雙向迭代器既可向前也可向后(list
),隨機(jī)訪問(wèn)迭代器可以通過(guò)下標(biāo)訪問(wèn)任何合法的位置(vector
)。
面試官:你知道適配器是做什么的嗎?
二師兄:適配器是一種設(shè)計(jì)模式。主要起到將不同的接口統(tǒng)一起來(lái)的作用。STL中的容器適配器如stack
和queue
,通過(guò)調(diào)用容器的接口,實(shí)現(xiàn)適配器所需的功能。
面試官:有了解過(guò)分配器嗎?
二師兄:分配器主要用于內(nèi)存的分配與釋放。一般容器都會(huì)自帶默認(rèn)分配器,很少會(huì)自己實(shí)現(xiàn)分配器。
面試官:有使用分配器做一些內(nèi)存分配的工作嗎?
二師兄:沒(méi)有。。。
面試官:知道仿函數(shù)是做什么用的嗎?
二師兄:是一個(gè)可執(zhí)行的對(duì)象,類(lèi)型重載了operator()()
運(yùn)算符。
struct Add { int operator()(int a, int b) {return a +b;} } int a = 42, b = 1024; auto sum = Add()(a,b); //OR Add add; auto sum = add(1,2);
面試官:STL中常見(jiàn)的算法有哪些?
二師兄:一般分為三類(lèi),查找、排序和數(shù)值操作。
二師兄:查找常用的有std::find
、std::find_if
、std::find_first_of
等。
二師兄:排序主要用std::sort
及其家族的一系列算法。
二師兄:數(shù)值操作主要用std::accumulate
求和。
面試官:那你知道STL六大部件之間的聯(lián)系嗎?
二師兄:(想了想)不是特別清楚。。。
面試官:好的,回去等通知吧。
讓我們回顧一下二師兄的表現(xiàn):
有使用分配器做一些內(nèi)存分配的工作嗎?
這里主要是問(wèn)有沒(méi)有手寫(xiě)過(guò)分配器:
template <typename T> class MyAllocator { public: typedef T value_type; MyAllocator() noexcept {} template <typename U> MyAllocator(const MyAllocator<U>&) noexcept {} T* allocate(std::size_t n) { if (n > std::size_t(-1) / sizeof(T)) throw std::bad_alloc(); if (auto p = static_cast<T*>(std::malloc(n * sizeof(T)))) return p; throw std::bad_alloc(); } void deallocate(T* p, std::size_t) noexcept { std::free(p); } };
實(shí)例中定義了一個(gè)名為MyAllocator
的模板類(lèi),它重載了allocate
和deallocate
運(yùn)算符用于分配內(nèi)存和釋放內(nèi)存。示例中malloc
和free
函數(shù)來(lái)分配和釋放內(nèi)存,也可以用new
和delete
。
我們可以在allocate
和deallocate
中做很多事情,比如我們可以統(tǒng)計(jì)申請(qǐng)和釋放內(nèi)存的總量,可以申請(qǐng)一塊大內(nèi)存做內(nèi)存池等等。
知道STL六大部件之間的聯(lián)系嗎?
這個(gè)問(wèn)題比較開(kāi)放,需要對(duì)STL六大部件有一定的理解。首先是分配器,主要是為容器分配管理內(nèi)存的。其次是迭代器,是容器和算法的橋梁。再次是仿函數(shù),一般用作算法中,適配器提供各種粘合劑的功能,把不同部件之間的接口連接起來(lái)。
以上就是C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解的詳細(xì)內(nèi)容,更多關(guān)于C++面試STL標(biāo)準(zhǔn)模板庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++圖文并茂講解類(lèi)型轉(zhuǎn)換函數(shù)
類(lèi)型轉(zhuǎn)換(type cast),是高級(jí)語(yǔ)言的一個(gè)基本語(yǔ)法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號(hào)內(nèi)加上類(lèi)型名來(lái)表示,接下來(lái)讓我們一起來(lái)詳細(xì)了解2022-05-05JetBrains?CLion永久激活超詳細(xì)教程(最新激活方法)
JetBrains?Clion?是一款專(zhuān)為?C/C++?開(kāi)發(fā)所設(shè)計(jì)的跨平臺(tái)?IDE,本文適用?JetBrains?CLion?v2019.3/3.1/3.2/3.3?永久激活,附破解補(bǔ)丁和激活碼,可以永久激活?Windows、MAC、Linux?下的?CLion,下面給大家分享JetBrains?CLion永久激活超詳細(xì)教程,感興趣的朋友一起看看吧2023-01-01C++如何使用new來(lái)初始化指向類(lèi)的指針
這篇文章主要介紹了C++如何使用new來(lái)初始化指向類(lèi)的指針問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07C++使用cjson操作Json格式文件(創(chuàng)建、插入、解析、修改、刪除)
本文主要介紹了C++使用cjson操作Json格式文件(創(chuàng)建、插入、解析、修改、刪除),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02C++中如何將operator==定義為類(lèi)的成員函數(shù)
這篇文章主要介紹了C++中如何將operator==定義為類(lèi)的成員函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01c++中冒號(hào)(:)和雙冒號(hào)(::)的使用說(shuō)明
以下是對(duì)c++中冒號(hào)和雙冒號(hào)的用法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07C語(yǔ)言實(shí)現(xiàn)掃雷游戲小項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11詳解Ubuntu18.04配置VSCode+CMake的C++開(kāi)發(fā)環(huán)境
這篇文章主要介紹了詳解Ubuntu18.04配置VSCode+CMake的C++開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
本篇文章是對(duì)使用OpenGL實(shí)現(xiàn)3D立體顯示的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05