学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

403

积分

0

好友

49

主题
发表于 前天 14:58 | 查看: 24| 回复: 1
某日二师兄参加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<函数的类型。
面试官:好的,不错,回去等通知吧。

二师兄今天表现如何呢?欢迎大家在评论区指正。

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
发表于 前天 14:58
<顺便吆喝一句,技术大厂年前捞人,前后端测试都有→https://jsj.top/f/o38ijj,感兴趣试试~>

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2025-1-22 12:48 , Processed in 0.185748 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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