• C++ -- 学习系列 std::array 容器


    1. std::array 是什么?

          array 容器是 C++ 11 标准中新增的序列式容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全,且效率并没有因此变差。

    与数组一样,其底层存储空间是连续的。

    array 和其它容器不同,array 容器的大小是固定的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法借由增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。

    2. 使用方法

    2.1. array 的模板参数:

        1.1   T 代表 array 中元素的类型

        1.2   N 代表 array 中元素的个数

    1. namespace std{
    2. template <typename T, size_t N>
    3. class array;
    4. }

    2.1  使用例子:

       

    1. // main.cpp
    2. #include
    3. #include
    4. #include
    5. #include
    6. template<typename T, size_t N>
    7. void printArray(std::array& arr)
    8. {
    9. // for(int i=0; i
    10. // {
    11. // std::cout << arr[i] << " ";
    12. // }
    13. for(auto it = arr.begin(); it != arr.end(); it++)
    14. {
    15. std::cout << *it << " ";
    16. }
    17. std::cout << std::endl;
    18. }
    19. void testArray()
    20. {
    21. // 两种初始化
    22. // 1. 列表初始化
    23. std::array<int, 6> arr1 = {1, 2, 3, 4, 5};
    24. // 2. 每个元素初始化
    25. std::array<int, 6> arr2;
    26. for(int i=0; i<5; i++)
    27. {
    28. arr2[i] = i+1;
    29. }
    30. std::cout << "print arr1 ---" << std::endl;
    31. printArray<int, 6>(arr1);
    32. std::cout << "print arr2 ---" << std::endl;
    33. printArray<int, 6>(arr2);
    34. std::array<int, 6> arr2(arr1);
    35. }
    36. int main()
    37. {
    38. testArray();
    39. return 0;
    40. }

    3. 简单实现

         

    1. // may_array.h
    2. #include
    3. #include
    4. template<typename _Tp, int N>
    5. class my_array
    6. {
    7. public:
    8. my_array();
    9. my_array(std::initializer_list<_Tp> valList);
    10. ~my_array();
    11. _Tp& operator[](int index)
    12. {
    13. return *(this->data + index);
    14. }
    15. _Tp& at(int index)
    16. {
    17. return this->operator[](index);
    18. }
    19. _Tp& front()
    20. {
    21. return *this->data;
    22. }
    23. _Tp& back()
    24. {
    25. return *(this->data + N - 1);
    26. }
    27. _Tp* begin()
    28. {
    29. return this->data;
    30. }
    31. _Tp* end()
    32. {
    33. return this->data + N;
    34. }
    35. const _Tp* const_begin()
    36. {
    37. return this->data;
    38. }
    39. const _Tp* const_end()
    40. {
    41. return this->data + N;
    42. }
    43. private:
    44. _Tp *data;
    45. _Tp* iterator;
    46. const _Tp* const_iterator;
    47. };
    48. template<typename _Tp, int N>
    49. my_array<_Tp, N>::my_array()
    50. {
    51. this->data = new _Tp[N];
    52. }
    53. template<typename _Tp, int N>
    54. my_array<_Tp, N>::~my_array()
    55. {
    56. delete data;
    57. }
    58. template<typename _Tp, int N>
    59. my_array<_Tp, N>::my_array(std::initializer_list<_Tp> valList)
    60. {
    61. if(valList.size() != N){
    62. std::cout << "error arguments size not equals to "<< N << std::endl;
    63. return;
    64. }
    65. this->data = new _Tp[N];
    66. int i = 0;
    67. for(auto iter = valList.begin(); iter != valList.end(); iter++)
    68. {
    69. *(this->data + (i++)) = *iter;
    70. }
    71. }
    72. // main.cpp
    73. #include
    74. #include
    75. #include"my_array.h"
    76. template <typename V, int N>
    77. void print(my_array& arr)
    78. {
    79. for(int i=0; i
    80. {
    81. std::cout << arr[i] << std::endl;
    82. }
    83. }
    84. int main(int argc, char *argv[])
    85. {
    86. my_array<int, 6> arr1;
    87. for(int i = 0; i < 6; i++)
    88. {
    89. arr1[i] = i + 1;
    90. }
    91. for(auto iter = arr1.begin(); iter != arr1.end(); iter++)
    92. {
    93. std::cout << *iter << " ";
    94. }
    95. std::cout << "-------" <
    96. for(auto iter = arr1.const_begin(); iter != arr1.const_end(); iter++)
    97. {
    98. std::cout << *iter << " ";
    99. }
    100. std::cout << "-------" <
    101. my_array3> arr2 = {"aa", "bb", "cc"};
    102. for(auto iter = arr2.begin(); iter != arr2.end(); iter++)
    103. {
    104. std::cout << *iter << " ";
    105. }
    106. std::cout << "-------" <
    107. for(auto iter = arr2.const_begin(); iter != arr2.const_end(); iter++)
    108. {
    109. std::cout << *iter << " ";
    110. }
    111. std::cout << "-------" <
    112. return 0;
    113. }

      

    参考文档:array 类(C++ 标准库) | Microsoft LearnC++ array(STL array)容器用法详解 (biancheng.net)

  • 相关阅读:
    代码混淆不再愁:一篇掌握核心技巧
    深拷贝和浅拷贝的区别
    第四十五章 命名空间和数据库 - 数据库基础知识
    [36c3 2019]includer
    sublime text 一些常用插件
    Java面向对象(上)
    硬件开发趋势与技术探索
    教育小程序的性能优化:从前端到后端的综合提升策略
    Javaweb三大组件知识点记录
    如何通过系统对MySQL进行“体检”
  • 原文地址:https://blog.csdn.net/qq_33775774/article/details/132795230