1. 程式人生 > >C++11系列學習之三----array/valarray

C++11系列學習之三----array/valarray

建立陣列,是程式設計中必不可少的一環。我們一般可以有以下幾種方法來建立陣列。

一、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;//長度為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中的

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 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
請按任意鍵繼續. . .
下面我們再說說以上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 ;
出錯。