array

  • c++11 封装了相关的数组模板类,不同于 C 风格数组,它不会自动退化成 T* 类型,它能作为聚合类型聚合初始化
  • std::array 是封装固定大小数组的容器,数组元素下标索引从 0 开始
// 模板类定义
template<typename _Tp, std::size_t _Nm>
struct array{...};// 数组元素个数为 0,访问时行为未定义
std::array<int, 0> arr;
// 常见初始化方法
int main()
{const int SIZE = 5;auto Print = [](const std::array<int, SIZE> &arr){std::cout << "arr value : \t";for (const auto &val : arr) {std::cout << val << "\t";}std::cout << "\n";};// 初始化容器std::array<int, SIZE> arr;Print(arr);  //  未初始化值为随机值for (int i = 0; i < SIZE; ++i) {  // 先定义,后初始化arr[i] = i;}Print(arr);std::array<int, SIZE> arr1{2,3,4,5,6};  // 定义并初始化Print(arr1);std::array<int, SIZE> arr2 = {1,2,3,4,5}; // 定义并初始化Print(arr2);std::array<int, SIZE> arr3{arr};Print(arr3);std::array<int, SIZE> arr4 = {arr};Print(arr4);std::array<int, SIZE> arr5 = arr;Print(arr5);std::array<int, SIZE> arr6;arr6 = arr;Print(arr6);return 0;
}

输出结果:
arr value : 8 0 4199705 0 8
arr value : 0 1 2 3 4
arr value : 2 3 4 5 6
arr value : 1 2 3 4 5
arr value : 0 1 2 3 4
arr value : 0 1 2 3 4
arr value : 0 1 2 3 4
arr value : 0 1 2 3 4

// 元素访问函数
int main()
{const int SIZE = 5;// 初始化容器std::array<int, SIZE> arr;for (int i = 0; i < SIZE; ++i) {  // 先定义,后初始化arr[i] = i;}// 元素访问// 访问指定的元素,同时进行越界检查std::cout << "arr.at(2) : " << arr.at(2) << std::endl;// 访问指定的元素,不进行越界检查std::cout << "arr[2] : " << arr[2] << std::endl;// 访问第一个元素std::cout << "arr.front() : " << arr.front() << std::endl;// 访问最后一个元素std::cout << "arr.back() : " << arr.back() << std::endl;// 返回指向内存中数组第一个元素的指针printf("arr[0] address : %#p\tarr.data() address : %#p\n", &arr[0], arr.data());return 0;
}

输出结果:
arr.at(2) : 2
arr[2] : 2
arr.front() : 0
arr.back() : 4
arr[0] address : 0x65fdf0 arr.data() address : 0x65fdf0

// 使用迭代器对元素访问
int main()
{const int SIZE = 5;// 初始化容器std::array<int, SIZE> arr{1, 2, 3, 4, 5};// 迭代器,本身类似指针,stl 提供的一种容器元素操作方法// 返回指向起始的迭代器,iterator 迭代器可读写,const_iterator 迭代器可读std::array<int, SIZE>::iterator iter = arr.begin();  // 可使用 auto 简化,auto iter = arr.begin();for (; iter != arr.end(); ++iter) {std::cout << *iter << "\t";}std::cout << "\n";std::array<int, SIZE>::const_iterator iter2 = arr.cbegin();for (; iter2 != arr.cend(); ++iter2) {std::cout << *iter2 << "\t";}std::cout << "\n";// 返回指向末尾的迭代器,指向最后一个元素的下一个位置printf("(arr.data() + 5) addr : %#p\tarr.end() addr : %#p\n", (arr.data() + 5), arr.end());printf("(arr.data() + 5) addr : %#p\tarr.cend() addr : %#p\n", (arr.data() + 5), arr.cend());// 返回指向起始的逆向迭代器std::array<int, SIZE>::reverse_iterator iter3 = arr.rbegin();for (; iter3 != arr.rend(); ++iter3) {std::cout << *iter3 << "\t";}std::cout << "\n";std::array<int, SIZE>::const_reverse_iterator iter4 = arr.crbegin();for (; iter4 != arr.crend(); ++iter4) {std::cout << *iter4 << "\t";}std::cout << "\n";// 返回指向末尾的逆向迭代器printf("(arr.data() - 1) addr : %#p\tarr.rend() addr : %#p\n", (arr.data() - 1), &(*arr.rend()));printf("(arr.data() - 1) addr : %#p\tarr.crend() addr : %#p\n", (arr.data() - 1), &(*arr.crend()));return 0;
}

输出结果:
0 1 2 3 4
0 1 2 3 4
(arr.data() + 5) addr : 0x66fdc4 arr.end() addr : 0x66fdc4
(arr.data() + 5) addr : 0x66fdc4 arr.cend() addr : 0x66fdc4
4 3 2 1 0
4 3 2 1 0
(arr.data() - 1) addr : 0x66fdac arr.rend() addr : 0x66fdac
(arr.data() - 1) addr : 0x66fdac arr.crend() addr : 0x66fdac

int main()
{const int SIZE = 5;// 初始化容器std::array<int, SIZE> arr{1, 2, 3, 4, 5};// 数组容量访问函数// 检查容器是否为空,为空返回 truestd::cout << std::boolalpha << "arr.empty() : " << arr.empty() << std::endl;// 返回容纳的元素数std::cout << "arr.size() : " << arr.size() << std::endl;// 返回可容纳的最大元素数std::cout << "arr.max_size() : " << arr.max_size() << std::endl;return 0;
}

输出结果:
arr.empty() : false
arr.size() : 5
arr.max_size() : 5

// 数组操作函数
int main()
{const int SIZE = 5;auto Print = [](const std::string &str, const std::array<int, SIZE> &arr){std::cout << str << " value : \t";for (const auto &val : arr) {std::cout << val << "\t";}std::cout << "\n";};// 初始化容器std::array<int, SIZE> arr{1, 2, 3, 4, 5};Print("original arr", arr);// 数组操作// 以指定值填充容器arr.fill(10);Print("fill arr", arr);// 交换数组内容,数组元素个数和类型相同std::array<int, SIZE> arr2{};  // 初始化为零Print("original arr2", arr2);arr2.swap(arr);Print("swap arr", arr);Print("swap arr2", arr2);return 0;
}

输出结果:
original arr value : 1 2 3 4 5
fill arr value : 10 10 10 10 10
original arr2 value : 0 0 0 0 0
swap arr value : 0 0 0 0 0
swap arr2 value : 10 10 10 10 10

#include <iostream>
#include <array>
#include <type_traits>
#include <tuple>int main()
{const int SIZE = 5;auto Print = [](const std::string &str, const std::array<int, SIZE> &arr){std::cout << str << " value : \t";for (const auto &val : arr) {std::cout << val << "\t";}std::cout << "\n";};// 初始化容器std::array<int, SIZE> arr1{1, 2, 3, 4, 5};std::array<int, SIZE> arr2{1, 2, 3, 4, 6};// 非成员函数 (operator 相关操作在 c++20 中被移除)// 按照字典顺序比较 array 中的值// operator==、operator!=、operator<、operator<=、operator>、operator>=std::cout << std::boolalpha << "arr1 == arr2 : " << (arr1 == arr2) << std::endl;std::cout << std::boolalpha << "arr1 != arr2 : " << (arr1 != arr2) << std::endl;std::cout << std::boolalpha << "arr1 < arr2 : " << (arr1 < arr2) << std::endl;std::cout << std::boolalpha << "arr1 <= arr2 : " << (arr1 <= arr2) << std::endl;std::cout << std::boolalpha << "arr1 > arr2 : " << (arr1 > arr2) << std::endl;std::cout << std::boolalpha << "arr1 >= arr2 : " << (arr1 >= arr2) << std::endl;// 访问 array 的一个元素std::cout << "arr1[0] : " << std::get<0>(arr1) << std::endl;// 特化 std::swap 算法Print("original arr1", arr1);Print("original arr2", arr2);std::swap(arr1, arr2);Print("swap arr1", arr1);Print("swap arr2", arr2);// 辅助类操作// 获得 array 的大小std::cout << "std::array<int, SIZE> size : " << std::tuple_size<std::array<int, SIZE> >::value << std::endl;// 获得 array 元素的类型using type_t = std::tuple_element<0, decltype (arr1)>::type;std::cout << std::boolalpha << std::is_same<int, type_t>::value << std::endl;return 0;
}

输出结果:
arr1 == arr2 : false
arr1 != arr2 : true
arr1 < arr2 : true
arr1 <= arr2 : true
arr1 > arr2 : false
arr1 >= arr2 : false
arr1[0] : 1
original arr1 value : 1 2 3 4 5
original arr2 value : 1 2 3 4 6
swap arr1 value : 1 2 3 4 6
swap arr2 value : 1 2 3 4 5
std::array<int, SIZE> size : 5
true

std::array相关推荐

  1. 【C++】40. std::array与int a[]方式创建数组的区别

    C++11中std::array的使用 std::array<type,size> array1; std::array<int,3> array1和 int a[]={1,2 ...

  2. C 语言中std::array的神奇用法总结

    std::array是在C 11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素 ...

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

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

  4. 关于拷贝常规数组、std::array和std::vector速度的一些测试

    最近在写一些有关AI的算法,需要的一些数据结构要用到复制的操作.因此在这里测试了一下各种数据的复制速度,编译器支持C++11/14. #include <iostream> #includ ...

  5. C++ STL源码剖析 tr1与std array

    C++ STL源码剖析 tr1与std array 深入底层,层层剖析by 光城 0.导语 源码剖析版本为gcc4.9.1. C++ tr1全称Technical Report 1,是针对C++标准库 ...

  6. C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

    某些算法会重排容器中元素的顺序,如std::sort.调用sort会重排输入序列中的元素,使之有序,它默认是利用元素类型的<运算符来实现排序的.也可以重载sort的默认排序,即通过sort的第三 ...

  7. C++_STL——array(C++11)

    C++_STL--array(C++11) 1.类模板 template < class T, size_t N > class array; 1.1容器属性 容器属性 序列 序列容器中的 ...

  8. 如何将std :: string转换为const char *或char *?

    如何将<code>std::string转换为char*或const char* ? #1楼 看看这个: string str1("stackoverflow"); c ...

  9. C++ STL容器——序列式容器(array、vector、deque、list)

    概述 1.C++ STL的容器分为三种,序列式容器,关联式容器,无序式容器,这里先说说常用的序列式容器. 2.array,vector,deque,list,forward_list这几种都是序列式容 ...

最新文章

  1. 经典语录【摘自网路】
  2. 【upc5020】 Knight
  3. 三种css样式表及其优先级
  4. jquery-uploadifyv3.2.1 文件上传插件 学习
  5. SAP收购的coresystem app的使用截图
  6. day01语法python入门_2
  7. [机器学习笔记] Note1--机器学习简介
  8. 华为云OCR文字识别 免费在线体验!
  9. java中readline函数_自定义BufferedReader中read和readLine方法
  10. windows运行linux系统,coLinux:在Windows运行Linux系统(教程)
  11. Bug错误一:报this.setData is not a function错误
  12. Kali在Vmware中通过Bridge联网
  13. [Python] np.array() 创建ndarray类型的数组
  14. mini2440 uboot使用nfs方式引导内核,文件系统
  15. Yii2给数据库表添加字段后对应模型无法识别到该属性的原因和解决办法
  16. php调用纯真ip,PHP调用纯真IP数据库返回具体地址
  17. hutool对称加密
  18. 只需要5秒就能克隆出你的声音
  19. 校园导航系统课程设计,#校园管理系统
  20. 解决Navicat远程服务器2013-Lost connection to MYSQL server at 'waitting for initial communication packet'

热门文章

  1. SQL SERVER 数据库升级操作流程
  2. C# 与 Java前景,一切不以应用场景为出发点的语言之争都是耍流氓。
  3. signal()函数的使用及小结
  4. 《人民日报》聚焦智能制造,格创东智、航天云网、京东助推制造业数字化
  5. 2015年07月苹果IOS上架App Store商店步骤
  6. 国开c语言程序设计作业答案,C语言程序设计参考答案
  7. 计算机网络知识点(一) 引言
  8. 令人难忘的爱情电影10场经典对白
  9. RK3568 buildroot文件系统下的三屏显示
  10. 关于Excel导出实例(适合新手,比较详细)