创建数组,是程序设计中必不可少的一环。我们一般可以有以下几种方法来创建数组。
一、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 数组模板 ,在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 面向数值计算的数组,在C++11中才支持
支持很多数值数组操作,如求数组总和、最大数、最小数等。
需要头文件 valarray 支持
- #include <iostream>
- #include <valarray>
- using namespace std;
- int main()
- {
- valarray<int> a;//长度为0
- valarray<double> g(10);//长度为10
- valarray<int> hh(a);
- hh = a;
- valarray<float> h(3.14, 10);//长度为10,每个元素为3.14
- int days[10]
- = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
- valarray<int> b(days, 5);//长度为5,用数组初始化valarray
- cout << 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;
- }
- // ‘[]’ 操作
- #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 content
- std::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
- 请按任意键继续. . .
本质上,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 ;