某日二師兄參加XXX科技公司的C++工程師開發崗位第25面:
面試官:
array
熟悉嗎?二師兄:你說的是原生陣列還是
std::array
?面試官:你覺得兩者有什么區別?
二師兄:區別不是很大,原生陣列(非動態陣列)和std::array都在堆疊上開辟空間,初始化的時候需要提供陣列長度,且長度不可改變,有一點區別的是,
std::array
提供了安全的下標訪問方法at,當下標越界時會拋出例外,面試官:還有其他區別嗎?
二師兄:讓我想想,,,在當作引數傳遞時,原生陣列會退化為指標,而
std::array
會保留型別和長度資訊,面試官:好的,知道空陣列的長度和長度為0的std::array物件有什么區別嗎?
二師兄:(這也太***鉆了吧,,)空陣列的長度應該是0,但是長度為0的
std::array
物件的長度是1,因為它是空類,面試官:如果一個型別的拷貝建構式和拷貝賦值運算子是被洗掉的,可以使用
std::array
存盤它嗎?二師兄:當然可以,只是不能傳遞這個
std::array
物件,而只能傳遞這個物件的參考或指標,面試官:你覺得
array
和vector
的性能哪個好?二師兄:
array
的性能更好,array
的記憶體分配在堆疊上,編譯時候確定需要在堆疊上開辟的空間,vector
的元素存在堆上,需要開辟和釋放堆記憶體,但vector
更靈活,如果能提前確定資料量,使用reserve
函式一次性開辟空間,性能和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
實作編譯期排序,沒問題吧?二師兄:(終于,該來的還是來了!)我嘗試一下:
#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
引數型別自動推斷特性,實作了類似于泛型的效果,arr
可以是任何實作了constexpr opearator<
函式的型別,面試官:好的,不錯,回去等通知吧,
二師兄今天表現如何呢?歡迎大家在評論區指正,
對于文中出現的技術性錯誤,我們會不定期的推出勘誤文章,C++是一門艱深的語言,讓我們和二師兄一起精進吧,
關注我,帶你21天“精通”C++!(狗頭)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555920.html
標籤:其他
上一篇:celery筆記七之周期/定時任務及crontab定義
下一篇:返回列表