某日二师兄加入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对象,而只能传递这个对象的援用或指针。

面试官:你感觉arrayvector的性能哪个好?

二师兄: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++!(狗头)