目录

1、array模板类的定义

(1)array模板类的声明

(2)容器属性

(3)array模板类的说明

(4)array模板类头文件

2、array模板类的使用

(1)Iterators

(2)Capacity

(3)Element access

(4)Modifiers

(5)Compare

(6)Other

本章是对c++ array模板类的知识归纳,讲述了c++中array模板类的使用,不涉及原理方面的内容。

c++中的数组类型是继承了c语言的特性,在使用数组的时候要注意数组越界操作问题。为了更安全的对数组进行操作,c++提出了数组模板类array。

1、array模板类的定义
(1)array模板类的声明
template <class T,size_t N> class array;
数组类是固定大小的序列容器,它们包含以严格线性序列排序的特定数量的元素。数组类具有固定大小,并且不通过分配器管理其元素的分配,它们是封装固定大小元素数组的聚合类型。

(2)容器属性
序列容器中的元素按严格的线性顺序排序。各个元素按其顺序访问它们的位置。
元素存储在连续的存储器位置,允许对元素进行恒定时间随机访问。可以偏移元素的指针以访问其他元素。
容器使用隐式构造函数和析构函数静态分配所需的空间。它的大小是编译时常量。没有内存或时间开销。
(3)array模板类的说明
array模板类中T为包含元素的类型(std::array::value_type),N为元素个数。

(4)array模板类头文件
使用array模板类之前需要包含#include <array>头文件!

2、array模板类的使用
(1)Iterators
Iterators迭代器的作用是遍历array数组类中的元素。可以通过begin/end()、rbegin/rend()、cbegin/cend()、crbegin/crend()等函数进行访问。

begin    Return iterator to beginning
end    Return iterator to end
rbegin    Return reverse iterator to reverse beginning
rend    Return reverse iterator to reverse end
cbegin    Return const_iterator to beginning
cend    Return const_iterator to end
crbegin    Return const_reverse_iterator to reverse beginning
crend    Return const_reverse_iterator to reverse end
参考代码如下所示:

/*****************************************************
Copyright (C) 2018. All rights reserved.
File name     : array.cpp
Version       : v1.0
Author        : zhengqijun
Date          : 2018-08-10
Function List :
Description   : array container.
******************************************************/
 
#include <iostream>
#include <array>
 
int main(void) {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
 
    std::cout << "array values: ";
    for (auto it = arr.begin(); it != arr.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
 
    return 0;
}
运行结果如下所示:

array values: 1 2 3 4 5
(2)Capacity
array数组容器的大小是固定的。可以通过sizeof()、size()、max_size()、empty()等函数进行检测。

size    Return size
max_size    Return maximum size
empty    Test whether list is empty
测试array数组容器大小的参考代码如下所示:

/*****************************************************
Copyright (C) 2018. All rights reserved.
File name     : array.cpp
Version       : v1.0
Author        : zhengqijun
Date          : 2018-08-10
Function List :
Description   : array container.
******************************************************/
 
#include <iostream>
#include <array>
 
int main(void) {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
 
    std::cout << "sizeof(array) = " << sizeof(arr) << std::endl;
    std::cout << "size of array = " << arr.size() << std::endl;
    std::cout << "max_size of array = " << arr.max_size() << std::endl;
 
    if (arr.empty()) {
        std::cout << "array is empty!" << std::endl;
    } else {
        std::cout << "array is not empty!" << std::endl;
    }
 
    return 0;
}
运行结果如下所示:

sizeof(array) = 20
size of array = 5
max_size of array = 5
array is not empty!
(3)Element access
可以通过下标[ ]、at()、front()、back()、data()等函数访问array容器内的元素。

operator[ ]    Access element
at    Access element 
front    Access first element
back    Access last element
data    Get pointer to first data
参考代码如下:

/*****************************************************
Copyright (C) 2018. All rights reserved.
File name     : array.cpp
Version       : v1.0
Author        : zhengqijun
Date          : 2018-08-10
Function List :
Description   : array container.
******************************************************/
 
#include <iostream>
#include <array>
 
int main(void) {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
 
    std::cout << "array[0] = " << arr[0] << std::endl;
    std::cout << "array.at(4) = " << arr.at(4) << std::endl;
    std::cout << "array.front() = " << arr.front() << std::endl;
    std::cout << "array.back() = " << arr.back() << std::endl;
    std::cout << "&array: " << arr.data() << " = " << &arr << std::endl;
 
    return 0;
}
运行结果如下所示:

array[0] = 1
array.at(4) = 5
array.front() = 1
array.back() = 5
&array: 0x7ffd22df6e50 = 0x7ffd22df6e50
(4)Modifiers
可以使用fill()、swap()等函数对array容器整体进行操作。

fill    Fill array with value
swap    Swap content
参考代码如下所示:

/*****************************************************
Copyright (C) 2018. All rights reserved.
File name     : array.cpp
Version       : v1.0
Author        : zhengqijun
Date          : 2018-08-10
Function List :
Description   : array container.
******************************************************/
 
#include <iostream>
#include <array>
 
int main(void) {
    std::array<int, 5> arr;
 
    arr.fill(5);  // fill
 
    std::cout << "array values: ";
    for (auto i : arr) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
 
    std::array<int, 3> first = {1, 2, 3};
    std::array<int, 3> second = {6, 5, 4};
 
    std::cout << "first  array values: ";
    for (auto it = first.begin(); it != first.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
 
    std::cout << "second array values: ";
    for (auto it = second.begin(); it != second.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
 
    first.swap(second);  // swap
 
    std::cout << "swap array success!" << std::endl;
 
    std::cout << "first  array values: ";
    for (auto it = first.begin(); it != first.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
 
    std::cout << "second array values: ";
    for (auto it = second.begin(); it != second.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
 
    return 0;
}
运行结果如下所示:

array values: 5 5 5 5 5 
first  array values: 1 2 3 
second array values: 6 5 4 
swap array success!
first  array values: 6 5 4 
second array values: 1 2 3 
(5)Compare
还可以使用>  <  ==等符号对两个array数组容器进行比较。

/*****************************************************
Copyright (C) 2018. All rights reserved.
File name     : array.cpp
Version       : v1.0
Author        : zhengqijun
Date          : 2018-08-10
Function List :
Description   : array container.
******************************************************/
 
#include <iostream>
#include <array>
 
int main(void) {
    std::array<int,5> a = {10, 20, 30, 40, 50};
    std::array<int,5> b = {10, 20, 30, 40, 50};
    std::array<int,5> c = {50, 40, 30, 20, 10};
 
    if (a == b) {
        std::cout << "a == b" << std::endl;
    } else {
        std::cout << "a != b" << std::endl;
    }
 
    if (a == c) {
        std::cout << "a == c" << std::endl;
    } else {
        std::cout << "a != c" << std::endl;
    }
 
    if (a < c) {
        std::cout << "a < c" << std::endl;
    } else {
        std::cout << "a >= c" << std::endl;
    }
 
    return 0;
}
 
运行结果如下所示:

a == b
a != c
a < c
(6)Other
c++重载了get()函数来访问数组容器中的元素,为了和元组相似,还重载了tuple_size和tuple_element类型。

get( array)    Get element (tuple interface)
tuple_element<array>    Tuple element type for array
tuple_size<array>    Tuple size traits for array
参考代码如下所示:

/*****************************************************
Copyright (C) 2018. All rights reserved.
File name     : array.cpp
Version       : v1.0
Author        : zhengqijun
Date          : 2018-08-10
Function List :
Description   : array container.
******************************************************/
 
#include <iostream>
#include <array>
#include <tuple>
 
int main(void) {
    std::array<int,3> myarray = {10, 20, 30};
    std::tuple<int, int, int> mytuple (10, 20, 30);
 
    std::tuple_element<0, decltype(myarray)>::type myelement;  // int myelement
 
    myelement = std::get<2>(myarray);
    std::get<2>(myarray) = std::get<0>(myarray);
    std::get<0>(myarray) = myelement;
 
    std::cout << "first element in myarray: " << std::get<0>(myarray) << std::endl;
    std::cout << "first element in mytuple: " << std::get<0>(mytuple) << std::endl;
 
    return 0;
}
运行结果如下所示:

first element in myarray: 30
first element in mytuple: 10
建议:多使用array数组容器代替c类型数组,使操作数组元素更加安全!

c++ array 模板类使用相关推荐

  1. c++ array模板类使用

    目录 1.array模板类的定义 (1)array模板类的声明 (2)容器属性 (3)array模板类的说明 (4)array模板类头文件 2.array模板类的使用 (1)Iterators (2) ...

  2. 【老九学堂】【C++】复合类型之vector和array模板

    今天我们就给小伙伴们简单的介绍一下数组的替代品,vector和array,模板类vector类似于string类,也是一种动态数组 .您可以在运行阶段的设置vector对象的长度,可在末尾附加新数据, ...

  3. 问模板函数、函数模板,模板类、类模板的区别的问题?

    问模板函数.函数模板,模板类.类模板的区别的问题? - 赵保龙 - 博客园 问模板函数.函数模板,模板类.类模板的区别的问题? 在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替 ...

  4. php 静态页面模板类,dedetag.class.php 静态模板类

    类文件 include/dedetag.class.php 这个文件是dedecms V5.3及之前版本使用的主要的模板类,它是解析式模板类,并非编译式的(区别是前者通过获得标签位置进行内容替换,后者 ...

  5. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)...

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code  1 2   template < class _Ty, cla ...

  6. [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)...

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code  1 2   template <  class _Ty,  c ...

  7. 模板类成员函数特例化写法

    现象: vs编译出现错误,即对函数ReleaseByOwner()进行了重定义: 解决: 先说一下我的开发背景: 原因: 在文件calibdt_array.h中定义了类Array,并声明了类内函数Re ...

  8. php标签class,dede模板标签以及dedetag.class.php模板类使用方法

    dede模板标签以及dedetag.class.php模板类使用方法 发布于 2015-05-16 08:59:24 | 146 次阅读 | 评论: 0 | 来源: 网友投递 DEDECMS 织梦内容 ...

  9. ecshop源码分析:smarty模板类

    花了差不多3天半的时间,基本上把ecshop1400多行的模板类源码阅读完毕.从构造函数一行一行的阅读下去,遇到方法的调用便进去,遇到返回值又回到调用它的地方,这样来回不知道多少遍,每次阅读都让我心奋 ...

最新文章

  1. u盘驱动 内核代码阅读 2.6.11.12版本
  2. pycryptodom的源码安装
  3. wxWidgets:wxBrush类用法
  4. Boost:自动索引允许的选项
  5. Spring Security-- 验证码功能的实现
  6. android activty动画,Activity动画效果
  7. 数据预处理第1讲:标准化
  8. 特殊字符的html编码转化
  9. GitHub引入了Reactions来提供对issue和pull request的反馈
  10. 经验| 张家口交通综合运行协调与应急指挥中心建设
  11. 2023年太原理工大学水利工程考研考情与难度、参考书前辈备考经验
  12. web入门【Response ServletContext】
  13. 娃哈哈,又c,又JAVA的,莫明其妙的
  14. Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C++)
  15. 怎样制作GIF拼图?教你一键在线拼图
  16. 二体问题之6:轨道根数及其转化
  17. CF1637E. Best Pair
  18. partition 0 ended too near . couldnt find ntldr
  19. 来说一说毕达哥拉斯定理
  20. P4961 小埋与扫雷

热门文章

  1. 查看oracle数据库的连接数以及用户
  2. hdu_1233(最小生成树)
  3. 自我小结--工作、学习、编码
  4. 用Unity3D实现简单的牧师与魔鬼游戏
  5. MFC 基础知识:主对话框与子对话框(二)
  6. 编写你的第一个 Django 应用,第 5 部分
  7. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1092:求出e的值
  8. PaddlePaddle训练营——公开课——AI核心技术掌握——第2章机器能“看”的现代技术——源自视觉神经原理的卷积网络简介及深入理解
  9. python人工智能——机器学习——特征工程
  10. 大数据WEB阶段(五)jQuery