c++数组:内置数组,可变大小数组vector,固定大小数组array,固定大小数值优化数组valarray

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

一、C++内置数组

数组大小固定,速度较快

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

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

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

二、vector创建数组

包含多种通用算法

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

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

  1. #include <iostream>  
  2. #include <vector>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     int n;  
  7.     cin >> n;  
  8.     vector<string> colors(n);  
  9.     cout << "array colors's length is " << colors.size();  
  10.     vector<int> weekdays;  
  11.     weekdays.push_back(2);  
  12.     system("pause");  
  13.     return 0;  
  14.   
  15. }  
三、array

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

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

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

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

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

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

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

需要头文件 valarray 支持

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

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

MatrixXf a(10,15);
VectorXf b(30);
下面我们重点谈一下array的用法。

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

template <class T, size_t N>
class array;

  1. <pre name="code" class="cpp">#include <iostream>  
  2. #include <array>     
  3. using namespace std;  
  4.   
  5. int main ()  
  6. {  
  7.      //-----------------------------------------------  
  8.   //--这是1维数组  
  9.     array<int,5> myarray={1,2,3,4,5};  
  10.  //-----------------------------------------------  
  11.   cout <<"myarray="<<endl;  
  12.   for (size_t n=0; n<myarray.size(); n++){  
  13.       cout << myarray[n] <<'\t';  
  14.   }  
  15.   cout << endl;  
  16.   //-----------------------------------------------  
  17.   //当然也可以使用  
  18.   cout <<"myarray="<<endl;  
  19.   for (size_t n=0; n<myarray.size(); n++){  
  20.       cout << myarray.at(n) << '\t';  
  21.   }  
  22.    cout << endl;  
  23.  //-----------------------------------------------  
  24.   //--这是2维数组,共3行2列  
  25.   array<array<int,2>,3 > myarray2D={1,2,3,4,5,6};  
  26.   //-----------------------------------------------  
  27.   cout <<"myarray2D="<<endl;  
  28.   for (size_t m=0; m<myarray2D.size(); m++){  
  29.     for (size_t n=0; n<myarray2D[m].size(); n++){      
  30.         cout << myarray2D[m][n] <<'\t';  
  31.     }   
  32.    cout << endl;   
  33.   }  
  34.   cout << endl;  
  35.   //-----------------------------------------------  
  36.     
  37.   return 0;  
  38. }  
下面我们将介绍array的几个函数: 
  1. // ‘[]’ 操作  
  2. #include <iostream>  
  3. #include <array>  
  4.   
  5. int main()  
  6. {  
  7.     std::array<int, 10> myarray;  
  8.     unsigned int i;  
  9.   
  10.     // assign some values:  
  11.     for (i = 0; i < 10; i++) myarray[i] = i * 10;  
  12.   
  13.     // print content  
  14.     std::cout << "myarray contains:";  
  15.     for (int &i : myarray)  
  16.         std::cout << " " << i;  
  17.   
  18.     std::cout << std::endl;  
  19.   
  20.     return 0;  
  21. }  
结果:
  1. myarray contains: 0 10 20 30 40 50 60 70 80 90  
  2. 请按任意键继续. . .  
  1. // data 成员函数:返回指向array第一个元素的指针  
  2. #include <iostream>  
  3. #include <cstring>  
  4. #include <array>  
  5.   
  6. int main()  
  7. {  
  8.     const char* cstr = "Test string";  
  9.     std::array<char, 12> charray;  
  10.   
  11.     memcpy(charray.data(), cstr, 12);  
  12.   
  13.     std::cout << charray.data() << std::endl;  
  14.   
  15.     return 0;  
  16. }  
结果:
  1. Test string  
  2. 请按任意键继续. . .  
  1. // fill 函数,设置array内部的所有元素为指定值  
  2. #include <iostream>  
  3. #include <array>  
  4.   
  5. int main() {  
  6.     std::array<int, 6> myarray;  
  7.   
  8.     myarray.fill(5);  
  9.   
  10.     std::cout << "myarray contains:";  
  11.     for (int& x : myarray) { std::cout << " " << x; }  
  12.   
  13.     std::cout << std::endl;  
  14.   
  15.     return 0;  
  16. }  
结果:
  1. myarray contains: 5 5 5 5 5 5  
  2. 请按任意键继续. . .  
  1. // swap 函数:交换两个array的内容,注意两个array必须是相同类型,相同大小  
  2. #include <iostream>  
  3. #include <array>  
  4.   
  5. int main()  
  6. {  
  7.     std::array<int, 5> first = { 10, 20, 30, 40, 50 };  
  8.     std::array<int, 5> second = { 11, 22, 33, 44, 55 };  
  9.   
  10.     first.swap(second);  
  11.   
  12.     std::cout << "first:";  
  13.     for (int& x : first) std::cout << " " << x;  
  14.     std::cout << std::endl;  
  15.   
  16.     std::cout << "second:";  
  17.     for (int& x : second) std::cout << " " << x;  
  18.     std::cout << std::endl;  
  19.   
  20.     return 0;  
  21. }  

结果:

  1. first: 11 22 33 44 55  
  2. second: 10 20 30 40 50  
  3. 请按任意键继续. . .  
下面我们再说说以上array、vector、valarray的区别。

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

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

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

  1. // swap 函数:交换两个array的内容,注意两个array必须是相同类型,相同大小  
  2. #include <iostream>  
  3. #include <array>  
  4. #include <vector>  
  5. using namespace std;  
  6. int main()  
  7. {  
  8.      int m = 5, n = 6;  
  9.     std::array < array<int, 5>, 6 > a ;  
  10.   
  11.     vector<vector <int> > ivec;  
  12.     ivec.resize(m, vector<int>(n));  
  13.   
  14.     return 0;  
  15. }  
当我们将
  1. std::array < array<int, 5>, 6 > a ;  
换成
  1. std::array < array<int, m>, n > a ;  
出错。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值