C++?std::array實(shí)現(xiàn)編譯器排序
某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第25面:
面試官:
array
熟悉嗎?二師兄:你說(shuō)的是原生數(shù)組還是
std::array
?面試官:你覺(jué)得兩者有什么區(qū)別?
二師兄:區(qū)別不是很大,原生數(shù)組(非動(dòng)態(tài)數(shù)組)和std::array都在棧上開(kāi)辟空間,初始化的時(shí)候需要提供數(shù)組長(zhǎng)度,且長(zhǎng)度不可改變。有一點(diǎn)區(qū)別的是,
std::array
提供了安全的下標(biāo)訪問(wèn)方法at,當(dāng)下標(biāo)越界時(shí)會(huì)拋出異常。面試官:還有其他區(qū)別嗎?
二師兄:讓我想想。。。在當(dāng)作參數(shù)傳遞時(shí),原生數(shù)組會(huì)退化為指針,而
std::array
會(huì)保留類(lèi)型和長(zhǎng)度信息。面試官:好的。知道空數(shù)組的長(zhǎng)度和長(zhǎng)度為0的std::array對(duì)象有什么區(qū)別嗎?
二師兄:(這也太***鉆了吧。。)空數(shù)組的長(zhǎng)度應(yīng)該是0,但是長(zhǎng)度為0的
std::array
對(duì)象的長(zhǎng)度是1,因?yàn)樗强疹?lèi)。面試官:如果一個(gè)類(lèi)型的拷貝構(gòu)造函數(shù)和拷貝賦值運(yùn)算符是被刪除的,可以使用
std::array
存儲(chǔ)它嗎?二師兄:當(dāng)然可以。只是不能傳遞這個(gè)
std::array
對(duì)象,而只能傳遞這個(gè)對(duì)象的引用或指針。面試官:你覺(jué)得
array
和vector
的性能哪個(gè)好?二師兄:
array
的性能更好,array
的內(nèi)存分配在棧上,編譯時(shí)候確定需要在棧上開(kāi)辟的空間。vector
的元素存在堆上,需要開(kāi)辟和釋放堆內(nèi)存。但vector
更靈活,如果能提前確定數(shù)據(jù)量,使用reserve
函數(shù)一次性開(kāi)辟空間,性能和array
沒(méi)有太大的差距。面試官:好的。你剛才說(shuō)
array
能在編譯時(shí)候確定需要在棧上開(kāi)辟的空間,請(qǐng)問(wèn)array
在編譯時(shí)還能夠做些什么?二師兄:比如給定一個(gè)
array
,我們可以在編譯時(shí)求它所以元素的和。
#include <iostream> #include <array> constexpr int sum(auto arr) { int res = 0; for (size_t i = 0; i < arr.size(); i++) res += arr[i]; return res; } int main(int argc, char const *argv[]) { constexpr std::array arr = {1,2,3,4,5,6,7,8,9}; constexpr int res = sum(arr); std::cout << res << std::endl; return 0; } //g++ test.cpp -std=c++20
面試官:好的,使用
array
實(shí)現(xiàn)編譯期排序,沒(méi)問(wèn)題吧?二師兄:(終于,該來(lái)的還是來(lái)了?。┪覈L試一下:
#include <iostream> #include <array> constexpr auto sort(auto arr) { for ( int i = 0; i < arr.size() -1; i++) { for ( int j = 0; j < arr.size() - i -1; j++) { if (arr[j] < arr[j + 1]) { auto tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } return arr; } int main(int argc, char const *argv[]) { constexpr std::array arr {10.5, 28.6, 4.4, 23.8, 12.4, 3.8, 19.7, 17.5, 19.1, 0.6, 1.9, 1.5, 25.4, 5.4}; constexpr auto arr2 = sort(arr); for (size_t i = 0; i < arr2.size(); i++) { std::cout << arr2[i] << std::endl; } return 0; } //g++ test2.cpp -std=c++20
二師兄:使用了C++20的
auto
參數(shù)類(lèi)型自動(dòng)推斷特性,實(shí)現(xiàn)了類(lèi)似于泛型的效果。arr
可以是任何實(shí)現(xiàn)了constexpr opearator<
函數(shù)的類(lèi)型。面試官:好的,不錯(cuò),回去等通知吧。
到此這篇關(guān)于C++ std::array實(shí)現(xiàn)編譯器排序的文章就介紹到這了,更多相關(guān)C++ std::array編譯器排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)密碼本小項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)密碼本小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02使用ShellClass獲取文件屬性詳細(xì)信息的實(shí)現(xiàn)方法
本篇文章是對(duì)ShellClass獲取文件屬性詳細(xì)信息的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)版通訊錄,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-08-08mfc入門(mén)教程之通過(guò)控制變量制作計(jì)算器
這篇文章主要介紹了mfc入門(mén)教程之通過(guò)控制變量制作計(jì)算器,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04c++使用單例模式實(shí)現(xiàn)命名空間函數(shù)案例詳解
這篇文章主要介紹了c++使用單例模式實(shí)現(xiàn)命名空間函數(shù),本案例實(shí)現(xiàn)一個(gè)test命名空間,此命名空間內(nèi)有兩個(gè)函數(shù),分別為getName()和getNameSpace(),本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-04-04C++實(shí)現(xiàn)AVL樹(shù)的示例詳解
AVL Tree 是一個(gè)「加上了額外平衡條件」的二叉搜索樹(shù),其平衡條件的建立是為了確保整棵樹(shù)的深度為O(log_2N),本文主要介紹了AVL樹(shù)的實(shí)現(xiàn),需要的可以參考一下2023-03-03