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<
函数的类型。面试官:好的,不错,回去等通知吧。
二师兄今天表现如何呢?欢迎大家在评论区指正。
对于文中出现的技术性错误,我们会不定期的推出勘误文章。C++是一门艰深的语言,让我们和二师兄一起精进吧。
关注我,带你21天“精通”C++!(狗头)
C++面试八股文:std::array如何实现编译器排序?的更多相关文章
- c++编译错误C2971:"std::array":array_size:包含非静态存储不能用作废类型参数;参见“std::array”的声明
在Qt5中这段代码编写有两种方式:一个编译成功,一个失败 成功版本: static constexpr size_t block_size = 0x2000;//8KB static constexp ...
- C++语言中std::array的神奇用法总结,你需要知道!
摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- C++ std::array
std::array template < class T, size_t N > class array; Code Example #include <iostream> ...
- std::array中的std::get<n>()
模板函数std::get<n>()是一个辅助函数,它能够获取到容器的第 n 个元素.模板参数的实参必须是一个在编译时可以确定的常量表达式,编译时会对它检查. get<n>()模 ...
- 将std::array转换成std::tuple
template<typename Array, std::size_t... Index> decltype(auto) array2tuple_impl(const Array& ...
- std::array,std::vector,基于范围的for循环
std::array除了有传统数组支持随机访问.效率高.存储大小固定等特点外,还支持迭代器访问.获取容量.获得原始指针等高级功能.而且它还不会退化成指针T *给开发人员造成困惑. for( 元素名变量 ...
- C++ Arrays, std::array, std::vector 总结
原文来自: https://shendrick.net/Coding%20Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick Original a ...
- 《面试八股文》之kafka21卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...
- 《面试八股文》之 Redis 16卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...
随机推荐
- R语言文本数据挖掘(三)
文本分词,就是对文本进行合理的分割,从而可以比较快捷地获取关键信息.例如,电商平台要想了解更多消费者的心声,就需要对消费者的文本评论数据进行内在信息的数据挖掘分析,而文本分词是文本挖掘的重要步骤.R语 ...
- [大数据]Hadoop常用命令合集
hadoop 查看hadoop版本 # hadoop version SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found ...
- [网络/Linux]CentOS7:OpenSSH升级到7.9p1 | 含: 安装Telnet/OpenSSH【telnet/ssh】
[Q0 OpenSSH/sshd/ssh/scp/sftp,及OpenSSL这些软件组件之间有什么联系吗?] 请跳转咱的另一篇博文,相信阅读完后,你会清楚很多: [网络/SSH]OpenSSH: ss ...
- boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续)
boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续) 书接上回 项目源码仓库github 项目源码仓库gitee boot-admin 是一款采用前后端分离 ...
- CVE-2015-5254漏洞复现
1.漏洞介绍. Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持 Java 消息服务,集群,Spring Framework 等.Apache ...
- xcode历史版本下载
一.背景 较早之前做过一个项目,当时使用swift 3.x开发. 项目结束后就没再有新需求与更新. 但最近呢需要对项目的某些功能进行调整,项目又重新被拾了起来. 我们知道现在的swift 版本已经到了 ...
- 小程序 TS 封装API
通俗易懂不说废话,拿去用,看两遍就能理解. 1 const { baseUrl } = require('./env').dev; 2 const token = wx.getStorageSync( ...
- .NET Core 波场链离线签名、广播交易(发送 TRX和USDT)笔记
Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. ...
- Keepalived 高可用
Keepalived 高可用 什么是高可用 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的. 高可用通常使用的软件 keep ...
- 2020-03-02:在无序数组中,如何求第K小的数?
2020-03-02:在无序数组中,如何求第K小的数? 福哥答案2021-03-02: 1.堆排序.时间复杂度:O(N*lgK).有代码. 2.单边快排.时间复杂度:O(N).有代码. 3.bfprt ...