C++ 中的 std::array 实现编译器排序
某日二师兄参加 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,我们可以在编译时求它所以元素的和。
面试官:好的,使用 array 实现编译期排序,没问题吧?
二师兄:(终于,该来的还是来了!)我尝试一下:
二师兄:使用了 C++20 的 auto 参数类型自动推断特性,实现了类似于泛型的效果。arr 可以是任何实现了 constexpr opearator<函数的类型。
面试官:好的,不错,回去等通知吧。
版权声明: 本文为 InfoQ 作者【向阳逐梦】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc255aa5c80946c31b50b4b5b】。文章转载请联系作者。
评论