经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++面试八股文:std::array如何实现编译器排序?
来源:cnblogs  作者:二进制架构  时间:2023/6/26 8:50:09  对本文有异议

某日二师兄参加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,我们可以在编译时求它所以元素的和。

  1. #include <iostream>
  2. #include <array>
  3. constexpr int sum(auto arr)
  4. {
  5. int res = 0;
  6. for (size_t i = 0; i < arr.size(); i++) res += arr[i];
  7. return res;
  8. }
  9. int main(int argc, char const *argv[])
  10. {
  11. constexpr std::array arr = {1,2,3,4,5,6,7,8,9};
  12. constexpr int res = sum(arr);
  13. std::cout << res << std::endl;
  14. return 0;
  15. }
  16. //g++ test.cpp -std=c++20

面试官:好的,使用array实现编译期排序,没问题吧?

二师兄:(终于,该来的还是来了!)我尝试一下:

  1. #include <iostream>
  2. #include <array>
  3. constexpr auto sort(auto arr)
  4. {
  5. for ( int i = 0; i < arr.size() -1; i++)
  6. {
  7. for ( int j = 0; j < arr.size() - i -1; j++)
  8. {
  9. if (arr[j] < arr[j + 1])
  10. {
  11. auto tmp = arr[j];
  12. arr[j] = arr[j+1];
  13. arr[j+1] = tmp;
  14. }
  15. }
  16. }
  17. return arr;
  18. }
  19. int main(int argc, char const *argv[])
  20. {
  21. 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};
  22. constexpr auto arr2 = sort(arr);
  23. for (size_t i = 0; i < arr2.size(); i++)
  24. {
  25. std::cout << arr2[i] << std::endl;
  26. }
  27. return 0;
  28. }
  29. //g++ test2.cpp -std=c++20

二师兄:使用了C++20的auto参数类型自动推断特性,实现了类似于泛型的效果。arr可以是任何实现了constexpr opearator<函数的类型。

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

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

对于文中出现的技术性错误,我们会不定期的推出勘误文章。C++是一门艰深的语言,让我们和二师兄一起精进吧。

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

原文链接:https://www.cnblogs.com/binarch/p/17504146.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号