写点什么

C++ 中的 std::array 实现编译器排序

作者:向阳逐梦
  • 2023-07-26
    四川
  • 本文字数:1278 字

    阅读完需:约 4 分钟

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,我们可以在编译时求它所以元素的和。


#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<函数的类型。

面试官:好的,不错,回去等通知吧。


发布于: 刚刚阅读数: 4
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
C++ 中的std::array实现编译器排序_向阳逐梦_InfoQ写作社区