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

 更新时间:2023年06月26日 08:45:22   作者:binarch  
这篇文章主要介绍了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对象,而只能传递这个对象的引用或指针。

面试官:你觉得arrayvector的性能哪个好?

二师兄: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<函数的类型。

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

到此这篇关于C++ std::array实现编译器排序的文章就介绍到这了,更多相关C++ std::array编译器排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中将string类型转化为int类型

    C++中将string类型转化为int类型

    本文主要介绍了C++中将string类型转化为int类型的方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C语言实现输出平均成绩最高学生的信息

    C语言实现输出平均成绩最高学生的信息

    这篇文章主要介绍利用C语言实现输出平均成绩最高学生的信息,文章举例说明并附有详细代码,需要的朋友可以参考一下
    2021-10-10
  • C++之std命名空间

    C++之std命名空间

    这篇文章主要介绍了C++之std命名空间使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++线程之thread详解

    C++线程之thread详解

    这篇文章主要为大家详细介绍了C++线程中的thread,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++ 栈和队列的实现超详细解析

    C++ 栈和队列的实现超详细解析

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2022-03-03
  • C++ OpenCV读写XML或YAML文件的方法详解

    C++ OpenCV读写XML或YAML文件的方法详解

    XML是一种元标记语言。所谓元标记,就是开发者可以根据自身需要定义自己的标记。YAML是一个可读性高,用来表达资料序列的格式。本文将通过C++和OpenCV实现这两种文件的读写,需要的可以参考一下
    2022-05-05
  • 基于QT5的文件读取程序的实现

    基于QT5的文件读取程序的实现

    本文主要介绍了基于QT5的文件读取程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言简明讲解队列的实现方法

    C语言简明讲解队列的实现方法

    队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素
    2022-04-04
  • C++自旋锁的实现示例

    C++自旋锁的实现示例

    自旋锁是一种非阻塞锁,线程在获取锁失败时会忙等待而不是挂起,它适用于锁持有时间极短的场景,可以在用户态运行,避免系统调用开销,下面就来详细的介绍一下C++自旋锁的使用,感兴趣的可以了解一下
    2026-02-02
  • 解析C/C++指针、函数、结构体、共用体

    解析C/C++指针、函数、结构体、共用体

    这篇文章主要介绍了C/C++指针、函数、结构体、共用体的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01

最新评论