創建數組,是程序設計中必不可少的一環。我們一般可以有以下幾種方法來創建數組。
一、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中的
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 ;
出錯。