创建数组,是程序设计中必不可少的一环。我们一般可以有以下几种方法来创建数组。

一、C++内置数组

数组大小固定,速度较快

通用格式是:数据类型   数组名[ 数组大小 ];

如 int a[40];//一维数组

int a[5][10];//二维数组

二、vector创建数组

包含多种通用算法

长度可变,使用灵活,但效率稍低

vector是使用 new 和 delete 来管理内存的

#include <iostream>
#include <vector>
using namespace std;
int main()
{int n;cin >> n;vector<string> colors(n);cout << "array colors's length is " << colors.size();vector<int> weekdays;weekdays.push_back(2);system("pause");return 0;}

三、array

array 数组模板 ,在C++11中才支持

通用格式:array<类型名, 元素个数>  数组名;

注意,因为长度固定,这里的元素个数不能是变量。

长度固定,提供了更好、更安全的接口,执行效率和内置数组相同,可以有效替代内置数组

<pre name="code" class="cpp">include <iostream>
#include <array>
using namespace std;void main()
{//-----------------------------------------------//--这是1维数组array<int, 5> myarray = { 1, 2, 3, 4, 5 };array<int, 5> m=myarray;//支持赋值array<int, 5> m2(myarray);//支持用一个数组去初始化另一个数组-----------------------------------------------//cout << "myarray=" << endl;//for (size_t n = 0; n < myarray.size(); n++){//   cout << myarray[n] << '\t';//}
}

四、valarray

valarray 面向数值计算的数组,在C++11中才支持

支持很多数值数组操作,如求数组总和、最大数、最小数等。

需要头文件 valarray 支持

#include <iostream>
#include <valarray>
using namespace std;int main()
{valarray<int> a;//长度为0valarray<double> g(10);//长度为10valarray<int> hh(a);hh = a;valarray<float> h(3.14, 10);//长度为10,每个元素为3.14int days[10]= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };valarray<int> b(days, 5);//长度为5,用数组初始化valarraycout << b.sum() << endl;//总和cout << b.max() << endl;//最大值cout << b.min() << endl;//最小值return 0;
}

五、调用第三方库,如Eigen中的

MatrixXf a(10,15);
VectorXf b(30);

下面我们重点谈一下array的用法。

Array 是一种大小固定的顺序容器。array 的申明:

template <class T, size_t N>
class array;
<pre name="code" class="cpp">#include <iostream>
#include <array>
using namespace std;int main ()
{//-----------------------------------------------//--这是1维数组array<int,5> myarray={1,2,3,4,5};//-----------------------------------------------cout <<"myarray="<<endl;for (size_t n=0; n<myarray.size(); n++){cout << myarray[n] <<'\t';}cout << endl;//-----------------------------------------------//当然也可以使用cout <<"myarray="<<endl;for (size_t n=0; n<myarray.size(); n++){cout << myarray.at(n) << '\t';}cout << endl;//-----------------------------------------------//--这是2维数组,共3行2列array<array<int,2>,3 > myarray2D={1,2,3,4,5,6};//-----------------------------------------------cout <<"myarray2D="<<endl;for (size_t m=0; m<myarray2D.size(); m++){for (size_t n=0; n<myarray2D[m].size(); n++){     cout << myarray2D[m][n] <<'\t';} cout << endl; }cout << endl;//-----------------------------------------------return 0;
}

下面我们将介绍array的几个函数:

// ‘[]’ 操作
#include <iostream>
#include <array>int main()
{std::array<int, 10> myarray;unsigned int i;// assign some values:for (i = 0; i < 10; i++) myarray[i] = i * 10;// print contentstd::cout << "myarray contains:";for (int &i : myarray)std::cout << " " << i;std::cout << std::endl;return 0;
}

结果:

myarray contains: 0 10 20 30 40 50 60 70 80 90
请按任意键继续. . .
// data 成员函数:返回指向array第一个元素的指针
#include <iostream>
#include <cstring>
#include <array>int main()
{const char* cstr = "Test string";std::array<char, 12> charray;memcpy(charray.data(), cstr, 12);std::cout << charray.data() << std::endl;return 0;
}

结果:

Test string
请按任意键继续. . .
// fill 函数,设置array内部的所有元素为指定值
#include <iostream>
#include <array>int main() {std::array<int, 6> myarray;myarray.fill(5);std::cout << "myarray contains:";for (int& x : myarray) { std::cout << " " << x; }std::cout << std::endl;return 0;
}

结果:

myarray contains: 5 5 5 5 5 5
请按任意键继续. . .
// swap 函数:交换两个array的内容,注意两个array必须是相同类型,相同大小
#include <iostream>
#include <array>int main()
{std::array<int, 5> first = { 10, 20, 30, 40, 50 };std::array<int, 5> second = { 11, 22, 33, 44, 55 };first.swap(second);std::cout << "first:";for (int& x : first) std::cout << " " << x;std::cout << std::endl;std::cout << "second:";for (int& x : second) std::cout << " " << x;std::cout << std::endl;return 0;
}

结果:

first: 11 22 33 44 55
second: 10 20 30 40 50
请按任意键继续. . .

下面我们再说说以上array、vector、valarray的区别。

本质上,vector与valarray是相同的,基本上将vector换成valarray即可。无非是valarray侧重于数值运算,因此增加了max,min,sum等函数。

而array与内置数组很接近,它的个数是事先给定的,不能更改。只不过是array更容易操作而已,也不用管理内存。

比如:我们想要动态创建二维数组,vector可以,但array不可以。

// swap 函数:交换两个array的内容,注意两个array必须是相同类型,相同大小
#include <iostream>
#include <array>
#include <vector>
using namespace std;
int main()
{int m = 5, n = 6;std::array < array<int, 5>, 6 > a ;vector<vector <int> > ivec;ivec.resize(m, vector<int>(n));return 0;
}

当我们将

std::array < array<int, 5>, 6 > a ;

换成

std::array < array<int, m>, n > a ;

出错。

C++11系列学习之三----array/valarray相关推荐

  1. C++11标准库 - array 1

    C++11标准库 - array std::array是原生数组的封装,它存放于栈上且大小固定,性能也与之相同.在原生数组的基础上,它添加了范围检查,以及其它的STL的相应特性,比如复制.交换.迭代器 ...

  2. C++11标准库 - array

    std::array是原生数组的封装,它存放于栈上且大小固定,性能也与之相同.在原生数组的基础上,它添加了范围检查,以及其它的STL的相应特性,比如复制.交换.迭代器.查询大小. 按照C++11的规范 ...

  3. C++11系列学习之七---------初始化列表

    一.前言 C++的学习中,我想每个人都被变量定义和申明折磨过,比如我在大学笔试过的几家公司,都考察了const和变量,类型的不同排列组合,让你区别有啥不同.反正在学习C++过程中已经被折磨惯了,今天再 ...

  4. C++11系列学习之六-----for

    前言     C++11这次的更新带来了令很多C++程序员期待已久的for range循环,每次看到javascript, lua里的for range,心想要是C++能有多好,心里别提多酸了.这次C ...

  5. C++11系列学习之四----auto

    在哪些情况下要申明类型: 定义变量类型 函数返回值,函数参数 表达式返回变量类型 auto关键字原理      在定义变量的时候必须申明类型,c++是强语言类型,在编译阶段需要知道类型,这样的好处是程 ...

  6. C++11系列学习之二-----lambda表达式

    C++11添加了一项名为lambda表达式的新功能,通过这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解. lambda表达式的语法如下所示: [capture_blo ...

  7. WPF系列学习之三(路由事件)

    路由事件实际上以一上 列三种方式出现.     1.与普通的.net事件类似的直接路由事件.它们起源于一个元素,并且不传递给其他元素.例如:MouseEnter事件.     2.在包含层次中向上传递 ...

  8. C++11系列学习之五-------decltype

    使用场景 在C++中经常要用到很长的变量名,如果已经有变量和你将使用的变量是一个类型,即可使用decltype关键字 来申明一样的类型变量. decltype原理      返回现有变量类型,decl ...

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

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

最新文章

  1. 10.1.5 布局优化利器之 Hierarchy Viewer
  2. 【转】VSS的配置和使用
  3. Eclipse闪退/打不开/无法启动/一闪而过
  4. Calendar的获取变化日期
  5. a站手机访问电脑版_公司电脑一键变网盘,支持手机、家里电脑远程访问
  6. 全球及中国再生橡胶产业发展动态及十四五运营状况分析报告2021版
  7. 7-3 输出最大公约数 (10 分)
  8. 数字游戏---巧妙解答
  9. JavaScript 大小转化B KB MB GB等的转化
  10. sin(a-b)=sina*cosb-sinb*cosa的推导过程
  11. Windows-Exploit-Suggester
  12. 免费logo设计在线生成
  13. 两人分组问题:显示In function 'int main()'求大佬解惑
  14. 局域网终端准入控制经典案例,不用SDN。
  15. SHELL DATE 命令详解
  16. labview 读取xml_在LabVIEW中使用XML
  17. 电子商务的 OKR(附案例)
  18. 《疯狂动物城》水彩画
  19. 学习 Java ,是看书学习快,还是看视频学习快呢 ?
  20. “猫癣”“犇牛”木马病毒肆虐 专家提醒补漏洞

热门文章

  1. java面向对象的特征三:多态性 —(15)
  2. java实验四——找鞍点
  3. HDU:4185-Oil Skimming
  4. Learn Python—表达式、数据类型、流程控制
  5. poj3278 【BFS】
  6. 设计模式六大原则(3)——依赖倒置原则
  7. Struts 2初体验
  8. css3中的BFC,IFC,GFC和FFC(转载)
  9. ios网络开发 网络状态检查
  10. (转)在ios android设备上使用 Protobuf (使用dll方式)