C++面试八股文:std::array如何实现编译器排序?

一给  金牌会员 | 2023-6-25 23:46:59 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 648|帖子 648|积分 1944

某日二师兄参加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,我们可以在编译时求它所以元素的和。
[code]#include #include constexpr int sum(auto arr){    int res = 0;    for (size_t i = 0; i < arr.size(); i++) res += arr;    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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表