C++?std::array實現(xiàn)編譯器排序
某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第25面:
面試官:
array
熟悉嗎?二師兄:你說的是原生數(shù)組還是
std::array
?面試官:你覺得兩者有什么區(qū)別?
二師兄:區(qū)別不是很大,原生數(shù)組(非動態(tài)數(shù)組)和std::array都在棧上開辟空間,初始化的時候需要提供數(shù)組長度,且長度不可改變。有一點區(qū)別的是,
std::array
提供了安全的下標(biāo)訪問方法at,當(dāng)下標(biāo)越界時會拋出異常。面試官:還有其他區(qū)別嗎?
二師兄:讓我想想。。。在當(dāng)作參數(shù)傳遞時,原生數(shù)組會退化為指針,而
std::array
會保留類型和長度信息。面試官:好的。知道空數(shù)組的長度和長度為0的std::array對象有什么區(qū)別嗎?
二師兄:(這也太***鉆了吧。。)空數(shù)組的長度應(yīng)該是0,但是長度為0的
std::array
對象的長度是1,因為它是空類。面試官:如果一個類型的拷貝構(gòu)造函數(shù)和拷貝賦值運算符是被刪除的,可以使用
std::array
存儲它嗎?二師兄:當(dāng)然可以。只是不能傳遞這個
std::array
對象,而只能傳遞這個對象的引用或指針。面試官:你覺得
array
和vector
的性能哪個好?二師兄:
array
的性能更好,array
的內(nèi)存分配在棧上,編譯時候確定需要在棧上開辟的空間。vector
的元素存在堆上,需要開辟和釋放堆內(nèi)存。但vector
更靈活,如果能提前確定數(shù)據(jù)量,使用reserve
函數(shù)一次性開辟空間,性能和array
沒有太大的差距。面試官:好的。你剛才說
array
能在編譯時候確定需要在棧上開辟的空間,請問array
在編譯時還能夠做些什么?二師兄:比如給定一個
array
,我們可以在編譯時求它所以元素的和。
#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
實現(xiàn)編譯期排序,沒問題吧?二師兄:(終于,該來的還是來了?。┪覈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ù)類型自動推斷特性,實現(xiàn)了類似于泛型的效果。arr
可以是任何實現(xiàn)了constexpr opearator<
函數(shù)的類型。面試官:好的,不錯,回去等通知吧。
到此這篇關(guān)于C++ std::array實現(xiàn)編譯器排序的文章就介紹到這了,更多相關(guān)C++ std::array編譯器排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用ShellClass獲取文件屬性詳細信息的實現(xiàn)方法
本篇文章是對ShellClass獲取文件屬性詳細信息的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05c++使用單例模式實現(xiàn)命名空間函數(shù)案例詳解
這篇文章主要介紹了c++使用單例模式實現(xiàn)命名空間函數(shù),本案例實現(xiàn)一個test命名空間,此命名空間內(nèi)有兩個函數(shù),分別為getName()和getNameSpace(),本文結(jié)合實例代碼給大家講解的非常詳細,需要的朋友可以參考下2023-04-04