技術(shù)交流QQ群:1027579432,歡迎你的加入宝恶!
1.Cpp中的數(shù)組
- C++支持數(shù)組數(shù)據(jù)結(jié)構(gòu)符隙,它可以存儲一個固定大小的相同類型的元素的順序集合。數(shù)組是用來存儲一系列數(shù)據(jù)垫毙,但它往往被認為是一系列相同類型的變量霹疫。數(shù)組的聲明并不是聲明一個個單獨的變量,如a0,a1,a2,a3,a4...,a99,而是聲明一個數(shù)組變量综芥,比如as,然后使用as[0],as[1],as[2],...,as[99]來代表一個個單獨的變量丽蝎,數(shù)組的特定元素可以通過索引來訪問。所數(shù)組都是由連續(xù)的內(nèi)存位置組成膀藐,最低的地址對應第一個元素屠阻,最高的地址對應最后一個元素。
2.聲明數(shù)組
- 在C++在聲明一個數(shù)組额各,需要指定元素的類型和元素的數(shù)量国觉,如下所示:
數(shù)據(jù)類型 數(shù)組名[元素數(shù)量];
- 上面聲明的格式是一維數(shù)組的聲明,其中元素個數(shù)必須是一個大于0的整型常量虾啦,數(shù)據(jù)類型可以是任意有效的C++數(shù)據(jù)類型麻诀。如聲明一個類型為double的包含10個元素的數(shù)組balance,聲明語句是: double balance[10];
3.初始化數(shù)組
- 在C++中缸逃,可以逐個初始化數(shù)組针饥,也可以使用一個初始化語句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
- 大括號{ }之間的值的數(shù)目不能大于在數(shù)組聲明時在方括號[ ]中指定的元素數(shù)目需频。
-
如果省略掉了數(shù)組的大小,數(shù)組的大小則為初始化時元素的個數(shù)筷凤。因此昭殉,如果是下面的格式,將創(chuàng)建一個數(shù)組藐守,它與前一個實例中所創(chuàng)建的數(shù)組是完全相同的
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
- 為數(shù)組中某個元素賦值的實例,下面的語句把數(shù)組中第五個元素的值賦為666.6挪丢。所有的數(shù)組都是以0作為它們第一個元素的索引,也被稱為基索引卢厂,數(shù)組的最后一個索引是數(shù)組的總大小減去1乾蓬。
balance[4] = 666.6;
4.訪問數(shù)組元素
-
數(shù)組元素可以通過數(shù)組名稱加索引進行訪問。元素的索引是放在方括號內(nèi)慎恒,跟在數(shù)組名稱的后邊任内。例如:
double salary = balance[3];
- 聲明數(shù)組撵渡、初始化數(shù)組、訪問數(shù)組元素實例如下:
#include "iostream" #include "iomanip" using namespace std; using std::setw; // setw() 函數(shù)來格式化輸出 int main(){ int a[10]; // 聲明一個包含10個元素的整型數(shù)組 // 初始化數(shù)組 for (int i = 0; i < 10; i++) a[i] = i + 100; cout << "元素索引" << setw(13) << "元素值" << endl; // 輸出數(shù)組中的每個元素 for (int j = 0; j < 10; j++) cout << setw(7) << j << setw(13) << a[j] << endl; return 0; }
5.與數(shù)組有關(guān)的概念
- 5.1 多維數(shù)組
- C++支持多維數(shù)組死嗦。多維數(shù)組聲明的一般形式如下:
數(shù)據(jù)類型名 數(shù)組名[size1][size2]...[sizeN];
- 例如趋距,下面的聲明創(chuàng)建了一個三維整型數(shù)組:
int tridim[5][10][4];
- 二維數(shù)組
- 多維數(shù)組最簡單的形式是二維數(shù)組。一個二維數(shù)組越除,在本質(zhì)上节腐,是一個一維數(shù)組的列表。聲明一個x行y列的二維整型數(shù)組摘盆,形式如下:
數(shù)據(jù)類型 數(shù)組名[x][y];
-
一個二維數(shù)組可以被認為是一個帶有x行和y列的表格翼雀。下面是一個二維數(shù)組,包含3行和4列:
- 因此孩擂,數(shù)組中的每個元素是使用形式為a[i][j]的元素名稱來標識的锅纺,其中a是數(shù)組名稱,i和j 是唯一標識a中每個元素的下標肋殴。
- 初始化二維數(shù)組
- 多維數(shù)組可以通過在括號內(nèi)為每行指定值來進行初始化,下面是一個帶有3行4列的數(shù)組囤锉。
int a[3][4] = { {0, 1, 2, 3}, /* 初始化索引號為 0 的行 */ {4, 5, 6, 7}, /* 初始化索引號為 1 的行 */ {8, 9, 10, 11}, /* 初始化索引號為 2 的行 */ };
-
內(nèi)部嵌套的括號是可選的,下面的初始化與上面是等同的:
int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
- 多維數(shù)組可以通過在括號內(nèi)為每行指定值來進行初始化,下面是一個帶有3行4列的數(shù)組囤锉。
- 訪問二維數(shù)組元素
-
二維數(shù)組中的元素是通過使用下標(即數(shù)組的行索引和列索引)來訪問的。例如:
int val = a[2][3];
- 二維數(shù)組如下:
// 1.二維數(shù)組 int aa[5][2] = {{0, 0}, {1, 2}, {2, 4}, {5, 7}, {9, 10}}; for (int i = 0; i < 5; i++){ for (int j = 0; j < 2; j++){ cout << "aa[" << i << "][" << j << "] = " << aa[i][j] << endl; } }
-
二維數(shù)組中的元素是通過使用下標(即數(shù)組的行索引和列索引)來訪問的。例如:
- 多維數(shù)組最簡單的形式是二維數(shù)組。一個二維數(shù)組越除,在本質(zhì)上节腐,是一個一維數(shù)組的列表。聲明一個x行y列的二維整型數(shù)組摘盆,形式如下:
- 5.2 指向數(shù)組的指針----數(shù)組指針
- 數(shù)組名是一個指向數(shù)組中第一元素的常量指針(int const *p;),因此,double a[40];a是一個指向&a[0]的指針护锤,即數(shù)組a的第一個元素的地址官地。因此,下面的程序片段p賦值給a的第一個元素的地址:
double *p; double a[10]; p = a;
- 使用數(shù)組名作為常量指針是合法的烙懦,因此*(a+4)是一種訪問a[4]數(shù)據(jù)的合法方式驱入。一旦把第一個元素的地址存儲在p中,就可以使用*p,*(p+1),*(p+2)等來訪問數(shù)組的元素氯析。
// 2.指向數(shù)組的指針:數(shù)組指針 double b[5] = {12.4, 3.1, 5.6, 0.8, 5.4}; double *p; // 一個指向double型的指針,可以存儲一個double類型變量的地址 p = b; cout << "使用指針的數(shù)組值 " << endl; for (int i = 0; i < 5; i++) cout << "*(p + " << i << ") = " << *(p + i) << endl; cout << "使用b作為地址的數(shù)組值 " << endl; for (int i = 0; i < 5; i++) cout << "*(b + " << i << ") = " << *(b + i) << endl;
- C++中亏较,將char*或char[]傳給cout進行輸出,結(jié)果會是整個字符串掩缓,如果想要獲得字符串的地址(第一個字符的地址)雪情,可以使用方法:強制轉(zhuǎn)化為其他指針(非char),可以是void*, float*,int*,double*等。使用&s[0]不能輸出s[0]的地址,因為&s[0]將返回char*,對于char*,cout會將其作為字符串來處理你辣,向下查找字符并輸出直到字符結(jié)束*巡通。
// C++中,將char*或char[]傳遞給cout進行輸出舍哄,結(jié)果會是整個字符串宴凉。如果想要獲得字符串的地址,強制轉(zhuǎn)化為其他指針(非char*) char var[MAX] = {'a', 'b', 'c'}; char *ptr; // 指針中的數(shù)組地址 ptr = var; for (int i = 0; i < 3; i++){ cout << "var[" << i << "]的地址是 = " << (int *)ptr << endl; cout << "var[" << i << "] = " << *ptr << endl; ptr++; // 移動到下一個位置 }
- 5.3 C++中傳遞數(shù)組給函數(shù)
- C++中可以通過指定不帶索引的數(shù)組名來傳遞一個指向數(shù)組的指針
- C++傳數(shù)組給一個函數(shù)表悬,數(shù)組類型自動轉(zhuǎn)換為指針類型弥锄,因此傳的實際是地址
- 如果想在函數(shù)中傳遞一個一維數(shù)組作為參數(shù),必須用下面三種方式來聲明函數(shù)形式參數(shù),這三種聲明方式的結(jié)果是一樣的籽暇,因為每種方式都會告訴編譯器將要接收一個整型指針温治。同樣的,也可以傳遞一個多維數(shù)組作為形式參數(shù)图仓。
- 方式1(形式參數(shù)是一個指針))
void func1(int *param){ ... }
- 方式2(形式參數(shù)是一個已定義大小的數(shù)組))
void func1(int params[10]){ ... }
- 方式3(形式參數(shù)是一個未定義大小的數(shù)組)
void func1(int params[]){ ... }
- 方式1(形式參數(shù)是一個指針))
- 實例如下:
// 3.C++中把數(shù)組傳遞給函數(shù)(方法1) int bb[5] = {1000, 2, 3, 17, 50}; double avg, avg1; // 傳遞一個指向數(shù)組的指針作為參數(shù) avg = getAverage(bb, 5); cout << "平均值: " << avg << endl; /*-----------------------方法2-----------------------*/ int bbb[5] = {1000, 2, 3, 17, 50}; int *ptr1 = bbb; // 分別計算數(shù)組元素個數(shù)罐盔,以及整型指針的字節(jié)數(shù) size_t bbb_size = sizeof(bbb) / sizeof(int); size_t ptr1_size = sizeof(ptr1); cout << "bbb size = " << bbb_size << endl; cout << "ptr1 size = " << ptr1_size << endl; avg1 = getAverage1(bbb, 5); cout << "平均值: " << avg1 << endl; // 方法1(下面的例子中把數(shù)組作為參數(shù),同時還傳遞了另一個參數(shù)) double getAverage(int arr[], int size){ int i, sum = 0; double avg; cout << "sizeof(arr) = " << sizeof(arr) << endl; for (i = 0; i < size; i++) sum += arr[i]; avg = double(sum) / size; return avg; } // 方法2 double getAverage1(int *arr, int size){ int i, sum = 0; double avg; cout << "sizeof(arr) = " << sizeof(arr) << endl; for (i = 0; i < size; i++) sum += arr[i]; avg = double(sum) / size; return avg; }
- 5.4 從函數(shù)返回數(shù)組
-
C++不允許返回一個完整的數(shù)組作為函數(shù)的參數(shù)救崔。但是惶看,可以通過指定不帶索引的數(shù)組名來返回一個指向數(shù)組的指針。C++不支持在函數(shù)外返回局部變量的地址六孵,除非定義局部變量為static變量纬黎。如果想要從函數(shù)返回一個一維數(shù)組,必須聲明一個返回指針的函數(shù)(指針函數(shù))劫窒,如下:
int * func(){ ... }
- 實例如下:
// 要生成和返回隨機數(shù)的函數(shù) int * getRandom(){ static int r[10]; // C++不支持在函數(shù)外返回局部變量的地址本今,除非定義局部變量為static變量 // 設(shè)置隨機數(shù)種子 srand((unsigned)time(NULL)); for (int i = 0; i < 10; i++){ r[i] = rand(); cout << "r[" << i << "] = " << r[i] << endl; } return r; } // 4.從函數(shù)返回數(shù)組----指針函數(shù) int *p1; p1 = getRandom(); for (int i = 0; i < 10; i++) cout << "*( p1 + " << i << ") = " << *(p1 + i) << endl;
6.數(shù)組中的細節(jié)知識
- 直接初始化字符數(shù)組char是特殊的,這種初始化需要一個null作為結(jié)尾的主巍。如下:
char a1[] = {'p', 'y', 't', 'h', 'o', 'n'}; // 初始化冠息,沒有 null char a2[] = {'p', 'y', 't', 'h', 'o', 'n', '\0'}; // 初始化,明確有 null char a3[] = "python"; // null 終止符自動添加 const char a4[6] = "python"; // 報錯孕索,沒有 null 的位置
- 數(shù)組的大小是固定的逛艰,不能額外增加元素,當想定義不固定大小的字符時搞旭,使用vector散怖!
vector<int> vec; // 創(chuàng)建向量用于存儲整型數(shù)據(jù) int m; // 顯示vec初始大小 cout << "vector size = " << vec.size() << endl; // 向向量vec追加5個整數(shù)值 for(int m = 0; m < 5; m++) vec.push_back(m); // 顯示追加后vec的大小 cout << "追加后的vector size = " << vec.size() << endl;
- 在C++中,setw(int n)用來控制輸出間隔肄渗,(n-1個空格),setw()默認填充的內(nèi)容是空格镇眷,可以使用setfill()配合使用設(shè)置其他字符填充。
cout << setfill('*') << setw(5) << 'a' << endl;
- 靜態(tài)與動態(tài)數(shù)組
靜態(tài) int array[100]; 定義了數(shù)組 array翎嫡,并未對數(shù)組進行初始化 int array[100] = {1, 2}; 定義并初始化了數(shù)組 array 動態(tài) int * array = new int[100]; 分配了長度為 100 的數(shù)組 array delete [] array; 動態(tài) int * array = new int[100]{1, 2}; 為長度為100的數(shù)組array初始化前兩個元素 delete [] array;
- 數(shù)組初始化時可以用聚合方法欠动,但是賦值時候不可以用聚合方法。舉例如下:
int array[] = {5,10,20,40}; // 合法 int array[]; int main() { array[] = {5,10,20,40}; // 不合法 return 0; }
- 數(shù)組在使用時可以是一個含有變量的表達式钝的,但是翁垂,在數(shù)組聲明時必須用常量表達式硝桩。例如:
// 合法 const int a=19; long b[a]; // 合法 const int a=19; long b[a+5]; // 不合法 int a=19; long b[a+5];
- 聲明一個任意長度的數(shù)組,可以用顯式的類型轉(zhuǎn)換枚荣,例如:
int a=19; int b[(const int)a];
- 也可以定義一個常量來聲明,例如:
int a=19; const int a1=a; int b[a1];
- Vector(向量): C++中的一種數(shù)據(jù)結(jié)構(gòu)碗脊,確切的說是一個類。它相當于一個動態(tài)的數(shù)組,當程序員無法知道自己需要的數(shù)組的規(guī)模多大時衙伶,用其來解決問題可以達到最大節(jié)約空間的目的祈坠。
- 用法:
- 1.文件包含:
- 首先在程序開頭處加上 #include<vector> 以包含所需要的類文件vector;還有一定要加上 using namespace std;
- 2.變量聲明:
- 2.1例: 聲明一個 int 向量以替代一維的數(shù)組: vector <int> a; (等于聲明了一個 int 數(shù)組 a[],大小沒有指定矢劲,可以動態(tài)的向里面添加刪除)赦拘。
- 2.2例: 用vector代替二維數(shù)組.其實只要聲明一個一維數(shù)組向量即可,而一個數(shù)組的名字其實代表的是它的首地址,所以只要聲明一個地址的向量即可芬沉,即: vector <int *> a躺同。同理想用向量代替三維數(shù)組也是一樣,vector <int**>a;
- 3.具體的用法以及函數(shù)調(diào)用:
- 3.1 得到向量中的元素和數(shù)組一樣丸逸,例如:
vector <int *> a int b = 5; a.push_back(b);//該函數(shù)下面有詳解 cout << a[0]; //輸出結(jié)果為5
- 使用數(shù)組給向量賦值:
vector<int> v( a, a+sizeof(a)/sizeof(a[0]) );
- 或者:
int a[]={1,2,3,4,5,6,7,8,9}; typedef vector<int> vec_int; vec_int vecArray(a,a+9);
- 3.1 得到向量中的元素和數(shù)組一樣丸逸,例如:
- 1.文件包含:
- 用法: