1. 程式人生 > >使用new和vector實現一維和二維陣列

使用new和vector實現一維和二維陣列

1.變長一維陣列   
  這裡說的變長陣列是指在編譯時不能確定陣列長度,程式在執行時需要動態分配記憶體空間的陣列。實現變長陣列最簡單的是變長一維陣列,你可以這樣做: 

注意int *p=new int[len];這一句,你不能這樣做:int  p[len];   
  C++編譯器會報錯說len的大小不能確定,因為用這種形式宣告陣列,陣列的大小需要在編譯時確定。因為用new開闢了一段記憶體空間後會返回這段記憶體的首地址,所以要把這個地址賦給一個指標,所以要用int  *p=new  int[len];   

注意:要登出指標p,使程式釋放用new開闢的記憶體空間。


#include <array>  
#include<vector> 
using namespace std;
 
int main()
{
	 int   len;
	 cin >> len;
 //用指標p指向new動態分配的長度為len*sizeof(int)的記憶體空間 
	int *p = new int[len];
	/*
//使用C++標準模版庫(STL)中的vector(向量)宣告變長陣列
		vector<int>array(len);		
for(int i=0;i<len;i++)
		{
			array[i]=i;
			cout<<array[i]<<"\t";
		}
	*/
	
	//對指標/陣列進行操作的程式碼
	//對指標/陣列進行操作的程式碼
	 delete[]   p;
	 return   0;
}

可以在使用完vector後呼叫~vector()解構函式釋放記憶體。   

2、變長n維陣列

用C++實現變長二維陣列時可以採用兩種方法:雙指標方法和使用STL中vector(向量)的方法。   
1>首先介紹一下雙指標方法,在這裡雙指標就是指像指標的指標,比如你可以這樣宣告一個數組:int   **p   =   new   int*[num1];   
  而對每一個*p(一共num1個*p)申請一組記憶體空間:   
  for(int   i=0;   i<num1;   ++i)   
    p[i]   =   new   int[num2];   
  其中,num1是行數,num2是陣列的列數。

//變長二維陣列
#include "stdafx.h"
#include <iostream>
#include <array>  
#include<malloc.h> 
#include<iomanip>
 
int main()
{
	int num1,num2;//num1指行數,num2指列數
	std::cout << "請輸入行數num1和列數num2:";
	std::cin >> num1 >> num2;
	//為二維陣列開闢空間
	int **p = new int*[num1];//num1個*p
	for (int i = 0; i < num1; i++)
	{
		p[i] = new int[num2];
	}
	for (int j = 0; j < num1; j++)
	{
		for (int k = 0; k < num2; k++)
		{
			p[j][k] = (j + 1)*(k + 1);
			std::cout << std::setw(6) << p[j][k] << ":" << std::setw(8) << &p[j][k];
		}
		std::cout << std::endl;
	}
	//釋放二維陣列佔用的空間
	for (int m = 0; m < num1; m++)
	{
		delete[] p[m];
	}
	delete[] p;
 
	 return   0;
}

由於陣列空間是動態分配的,陣列行之間的地址空間是不連續的,因為不同行的陣列元素的地址空間是用不同的new來分配的。而每一行之中列之間的地址空間是連續的。   

2>使用vector(向量)實現二維陣列


#include "stdafx.h"
#include <iostream>
#include<vector>
#include<iomanip>
 
using namespace std;
int main()
{
	int i, j;
	int m,n;//m指行數,n指列數
	std::cout << "請輸入行數num1和列數num2:";
	std::cin >> m >> n;
	//注意下面這一行:vector<int後兩個">"之間要有空格!否則會被認為是過載">>"
	vector<vector<int> >vecInt(m, vector<int>(n));//m行n列
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			vecInt[i][j] = i*j;
		}
	}
	//輸出二維陣列中的每個元素
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			cout << setw(5) << vecInt[i][j] << ":" << setw(9) << &vecInt[i][j];
		}
		cout << endl;
	 }
 
	 return   0;
}

這裡vector中元素的記憶體的地址分配也有同雙指標實現的二維陣列有同樣的特點。不過用vector的方法比使用雙指標簡單地多,分配記憶體空間時會更安全,陣列初始化程式碼也更簡單。

3>使用vector實現三維陣列


//變長三維陣列
#include "stdafx.h"
#include <iostream>
#include<vector>
#include<iomanip>
 
using namespace std;
int main()
{
	int i, j, k;
	int m,n,l;//m指一維,n指二維,l指三維
	cout << "請輸入第一維m和第二維n、第三維l:";
	cin >> m >> n>>l;
	//注意下面這一行:vector<int後兩個">"之間要有空格!否則會被認為是過載">>"
	vector<vector<vector<int> > >vecInt(m, vector<vector<int> >(n,vector<int>(l)));//m行n列
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			for (k = 0; k < l; k++)
			{
				vecInt[i][j][k] = i+j+k;
			}
			
		}
	}
	//輸出二維陣列中的每個元素
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			for (k = 0; k < l; k++)
			{
				cout << setw(5) << vecInt[i][j][k] << ":" << setw(8) << &vecInt[i][j][k];
			}
			cout << endl;
		}
		cout << endl;
	 }
 
	 return   0;
}