添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

上面一句是在栈上定义了一个长度为 5 的数组,下面一句是在堆上定义了一个长度为 5 的数组,并用一个指针指向它。

C++11 中,引入了一种新的数组定义方式 std::array

std::array的特性

std::array是具有固定大小的数组。因此,它并不支持添加或删除元素等改变大小的操作。也就是说,当定义一个array时,除了指定元素类型,还要指定容器大小

既然有了内置的数组,为什么还要引入 array 呢?

内置的数组有很多麻烦的地方,比如无法直接对象赋值,无法直接拷贝等等,同时内置的数组又有很多比较难理解的地方,比如数组名是数组的起始地址等等。相比较于如 vector 等容器的操作,内置数组确实有一些不方便的地方。因此, C++11 就引入 array 容器来代替内置数组。

简单来说, std::array除了有内置数组支持随机访问、效率高、存储大小固定等特点外,还支持迭代器访问、获取容量、获得原始指针等高级功能。而且它还不会退化成指针给开发人员造成困惑

std::array的使用

使用 array 之前,需要包含头文件:

# include <array>

定义array时,需要指定其数据类型和大小,两者不可或缺。同时,array的大小不能使用变量来指定,但对于内置数组来说,是可以使用变量来指定数组大小的

定义array时,可以使用{}来直接初始化,也可以使用另外的array来构造,但不可以使用内置数组来构造
例如:

# include <iostream>
# include <array>
int main(int argc, char const *argv[])
  std::array<int, 5> a0 = {0, 1, 2, 3, 4};          //正确
  std::array<int, 5> a1 = a0;                       //正确
  int m = 5;
  int b[m];                                 //正确,内置数组
  std::array<int, 5> a2;                    //正确
  std::array<int, m> a3;                    //错误,array不可以用变量指定
  std::array<int, 5> a4 = b;                //错误,array不可以用数组指定
  return 0;

如果使用gcc来进行编译,需要指定c++11标准

g++ test.cpp -o test -std=c++11
./test

std::array提供了[]atfrontbackdata的方式来进行元素:

访问方式含义
at访问指定的元素,同时进行越界检查
[]访问指定的元素
front访问第一个元素
back访问最后一个元素
data返回指向内存中数组第一个元素的指针

和一般的容器一样,array还提供了迭代器的方式进行元素遍历和访问:

迭代器含义
begin返回指向容器第一个元素的迭代器
end返回指向容器尾端的迭代器
rbegin返回指向容器最后元素的逆向迭代器
rend返回指向前端的逆向迭代器
# include <iostream>
# include <array>
int main(int argc, char const *argv[])
  std::array<int, 5> a = {0, 1, 2, 3, 4};
  std::cout << a.front() << " " << a.at(1) << " " << a[2] << " " << *(a.data() + 3) << " " << a.back() << std::endl;
  std::array<int, 5>::iterator iter;
  for (iter = a.begin(); iter != a.end(); ++iter)
    std::cout << *iter << " ";
  std::cout << std::endl;
  std::array<int, 5>::reverse_iterator riter;
  for (riter = a.rbegin(); riter != a.rend(); ++riter)
    std::cout << *riter << " ";
  std::cout << std::endl;
  return 0;

运行这段代码,输出为:

yngzmiao@yngzmiao-virtual-machine:~/test$ g++ test.cpp -o test -std=c++11
yngzmiao@yngzmiao-virtual-machine:~/test$ ./test
0 1 2 3 4
0 1 2 3 4 
4 3 2 1 0

array支持其它一些函数:

函数含义
empty检查容器是否为空
size返回容纳的元素数
max_size返回可容纳的最大元素数
fill以指定值填充容器
swap交换内容
#include <iostream>
#include <algorithm>
#include <array>
int main()
  std::array<int, 5> a1 = {4, 0, 2, 1, 3};
  std::array<int, 5> a2;
  std::sort(a1.begin(), a1.end());                  //排序函数
  for(int a: a1)
    std::cout << a << ' ';
  std::cout << std::endl;
  std::reverse(a1.begin(), a1.end());                           //反转a1
  for (std::array<int, 5>::iterator iter = a1.begin(); iter != a1.end(); ++iter)
    std::cout << *iter << " ";
  std::cout << std::endl;
  std::reverse_copy(a1.begin(), a1.end(), a2.begin());          //反转a1的内容拷贝到a2
  for (int i = 0; i < a2.size(); ++i)
    std::cout << a2[i] << " ";
  std::cout << std::endl;

运行这段代码,输出为:

yngzmiao@yngzmiao-virtual-machine:~/test$ g++ test.cpp -o test -std=c++11
yngzmiao@yngzmiao-virtual-machine:~/test$ ./test
0 1 2 3 4
4 3 2 1 0
0 1 2 3 4 

需要注意的是,std::reversestd::reverse_copy的区别,前者反转本身,后者反转本身的内容拷贝到另一个容器中

当学习C++的时候,数组是最基本的结构之一,通常通过以下的方式来定义:int a[5];int *b = new int[5];上面一句是在栈上定义了一个长度为5的数组,下面一句是在堆上定义了一个长度为5的数组,并用一个指针指向它。在C++11中,引入了一种新的数组定义方式std::array。std::array的特性std::array是具有固定大小的数组。因此,它并不支持添加...
摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发。 td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能。也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间;std::array的大小必须在编译期确定;std::array的构造函数、析构函数和赋值操作符都是编译器隐式声明的……这让很多用惯了std::vector这类容器的程序员不习惯,觉得std::array不好用。 但实际上,std::array的威力很可能被低估了。在
std::array是具有固定大小的数组,使用栈(静态内存分配)。支持快速随机访问,效率与数组相同。不能添加或删除元素。 需要包含头的头文件文件#include<array> 定义时必须指定array的大小,因为大小是模板参数之一,不可忽略; 定义时不能使用变量指定大小; 可通过array构造新的array,可以使用{}构造; 不可使用数组构造。 array<int,5>myarray={1,2,3,4,5}; array<int,5>othera...
1 - array是什么 array 容器是 C++11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全,且效率并没有因此变差。 特性:array 容器的大小是固定的,无法动态的扩展或收缩,这也就
std::array 是在 C++11 中引入的,与内置数组相比,std::array是一种更安全、更容易使用的数组类型。与内置数组类似,std::array对象的大小是固定的。因此,std::array不支持添加和删除元素以及改变容器大小的操作。 std::array 除了有传统数组支持随机访问、效率高、存储大小固定等特点外,还支持迭代器访问、获取容量、获得原始指针等高级功能。而且它还不会退化成指针T *给开发人员造成困惑。.........
一、顺序容器Array STL中的Array数组类型是在c++ TR1中才提出的,在之前只有Vector这个类似于数组的类型。但在实际应用中发现,vector和实际应用数组还是有非常大的区别,包括迭代器访问的控制,内存大小的控制等。用过vector的很容易发现它和实际使用中的数组的诸多不同之处。 换句话说,实际开发过程中,还是需要一个和数组高度类似的数据类型,这也是std::array的出现的一个原因,正如军事上的火力配比一样,不能出现火力空白区。那么这二者最关键的不同在哪儿呢?有两个主要方面,第一...
出处:https://stackoverflow.com/questions/4424579/stdvector-versus-stdarray-in-c 我把他们核心区别的几个单词用加黑标注出来了,原文很容易读懂理解,就不做翻译了。 英文原文: std::vector is a template class that encapsulate a dynamic array, stored in ...
   std::array是在C++ 11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能。也正因此,使得std::array有很多与其他容器不同的特殊之处,比如: std::array的元素是直接存放在实例内部,而不是在堆上分配间; std::array的大小必须在编译期确定。 std::array的构造函数、析构函数和赋值操作符都是编译器隐式声明的…… 概述1. std::array1. 1 常用函数1. 2 构造函数    std::array底层是一段连续的.
std::array是在C++11中才引入的,与内置数组相比,array是一种更安全、更容易使用的数组类型。与内置数组类似,array对象的大小是固定的。因此,array不支持添加和删除元素以及改变容器大小的操作。与内置数组一样,标准库array的大小也是类型的一部分。当定义一个array时,除了指定元素类型,还要指定容器大小。为了使用array类型,我们必须同时指定元素类型和大小。array仅仅是为普通数组添加了一些成员或全局函数,这使得数组能够被当成标准容器来使用。array不能被动态地扩展或压缩。 array 容器是C++11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。 array是将元素置于一个固定数组中加以管理的容器。 array可以随机存取元素,支持索引值直接存取, 用[]操作符或at()方法对元素进行操作,也可以使用迭代器访问 不支持动态的新增删除操作 array可以完全替代C语言中的数组,使操作数组元素更加安全! #include <array> array特点 array 容器的大小是..