某日二师兄参加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++是一门艰深的语言,让我们和二师兄一起精进吧。

关注我,带你21天“精通”C++!(狗头)

C++面试八股文:std::array如何实现编译器排序?的更多相关文章

  1. c++编译错误C2971:"std::array":array_size:包含非静态存储不能用作废类型参数;参见“std::array”的声明

    在Qt5中这段代码编写有两种方式:一个编译成功,一个失败 成功版本: static constexpr size_t block_size = 0x2000;//8KB static constexp ...

  2. C++语言中std::array的神奇用法总结,你需要知道!

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...

  3. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  4. C++ std::array

    std::array template < class T, size_t N > class array; Code Example #include <iostream> ...

  5. std::array中的std::get<n>()

    模板函数std::get<n>()是一个辅助函数,它能够获取到容器的第 n 个元素.模板参数的实参必须是一个在编译时可以确定的常量表达式,编译时会对它检查. get<n>()模 ...

  6. 将std::array转换成std::tuple

    template<typename Array, std::size_t... Index> decltype(auto) array2tuple_impl(const Array& ...

  7. std::array,std::vector,基于范围的for循环

    std::array除了有传统数组支持随机访问.效率高.存储大小固定等特点外,还支持迭代器访问.获取容量.获得原始指针等高级功能.而且它还不会退化成指针T *给开发人员造成困惑. for( 元素名变量 ...

  8. C++ Arrays, std::array, std::vector 总结

    原文来自: https://shendrick.net/Coding%20Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick Original a ...

  9. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  10. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

随机推荐

  1. 方差分析1—单因素方差分析(R语言)

    方差分析是由英国著名统计学家:R.A.Fisher推导,也叫F检验,用于多个样本间均数的比较(分析类别变量.有序变量).当包含的因子是解释变量时,关注的重点通常会从预测转向组别差异的分析.方差分析是一 ...

  2. 用 Go 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分. 示例: 输入:nums = [1,2,3,4]输出:[1,3,2,4] 注:[3,1, ...

  3. Unity学习笔记02 —— C#语法

    C#语法 控制台 Console Console.WriteLine(); Console.ReadLine(); 随机数 Random Random random = new Random(); r ...

  4. IDEA 修改Maven默认的全局设置

    每次打开Maven项目都需要重新配置Maven的地址.非常不爽! 解决方法:找到File->Other Settings->Default Settings 修改配置 下次打开就不用再配置 ...

  5. mysql迁移:docker迁入迁出mysql

    docker迁出mysql数据库 测试环境: docker服务器 mysql服务器 IP 192.168.163.19 192.168.163.16 操作系统 CentOS7.8 CentOS7.8 ...

  6. mysql导出csv

    1.正常查询 SELECT a.emp_no '员工号',b.seq '文章序号' from vote_records a INNER JOIN vote_content b ON a.vote_co ...

  7. 从零开始配置深度学习环境:CUDA+Anaconda+Pytorch+TensorFlow

    本文适用于电脑有GPU(显卡)的同学,没有的话直接安装cpu版是简单的.CUDA是系统调用GPU所必须的,所以教程从安装CUDA开始. CUDA安装 CUDA是加速深度学习计算的工具,诞生于NVIDI ...

  8. Kubernetes入门实践(环境搭建)

    容器技术只是解决了运维部署工作中的一个很小的问题,在现实生产环境中,除了最基本的安装,还会各式各样的需求,比如服务发现.负载均衡.状态监控.健康检查.扩容缩容.应用迁移.高可用等等.这些容器之上的管理 ...

  9. ubutn在线服务器python Package安装到离线服务器

    1.在线服务器导出requirement.txt pip freeze > requirement.txt 该文件生成完毕后,需要做些修改,去掉不需要的库,否则下载的时候会出错. 2.下载whl ...

  10. 基于海思H3520DV400和QT5.9设计的车载终端DVR控制平台

    ​ 目录 前言: 说明: 功能介绍: 设计思路: 详细设计: QT界面设计: 代码实现: 注意事项: (一)QT运行慢问题 (二)QT图层隐藏问题 (三)鼠标问题 (四)字体问题 (五)主界面图案 ( ...