某日二师兄参加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
#include
constexpr int sum(auto arr)
{
int res = 0;
for (size_t i = 0; i
面试官:好的,使用
array
实现编译期排序,没问题吧?二师兄:(终于,该来的还是来了!)我尝试一下:
#include
#include
constexpr auto sort(auto arr)
{
for ( int i = 0; i
二师兄:使用了C++20的
auto
参数类型自动推断特性,实现了类似于泛型的效果。arr
可以是任何实现了constexpr opearator函数的类型。
面试官:好的,不错,回去等通知吧。
二师兄今天表现如何呢?欢迎大家在评论区指正。
对于文中出现的技术性错误,我们会不定期的推出勘误文章。C++是一门艰深的语言,让我们和二师兄一起精进吧。
关注我,带你21天“精通”C++!(狗头)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net