在C++中,陣列的宣告被定義如下: ... 不過可以指定單個陣列元素輸入和輸出 ... int n ; cin >> n ; //陣列的長度 for (int i=0 ; i ...
Published
LinkedwithGitHub
Like
Bookmark
Subscribe
#陣列
##前導:陣列是什麼?
變數可以幫助我們儲存資料,但如果今天有若干筆資料要輸入,我們勢必要宣告一堆變數。
```cpp
intnum1,num2,num3......numn;
```
這樣寫起來太麻煩也太累人了
於是程式設計師們開發了一個好用的工具,叫做「陣列Array」
如果`int、float、char......`是宣告一個又一個的盒子
那麼Array就是宣告N個連貫的盒子
![](https://i.imgur.com/baSAdxh.png)
##語法:如何宣告陣列?
###在C++中,陣列的宣告被定義如下:
```cpp
typearrayName[arraySize];
```
*`type`為型別
*`arrayName`為陣列名稱,與其它型別宣告時的命名規則相同
*`arraySize`為陣列長度,只能是非負整數或是非負整數變數
###陣列的宣告
陣列的宣告範例如下:
```cpp
intarr1[3];
floatarr2[5];
doublearr3[7];
chararr4[9];
```
###陣列的索引值
```cpp
intarr[1000];
cout<>arr[49]>>arr[50];
cout<>arr[0]>>arr[1]>>arr[2]>>......>>arr[99];
cout<>n; //陣列的長度
for(inti=0;i>arr[i];
}
for(inti=0;i以下以二維陣列作為範例
```cpp
intarr1[3][4];
floatarr2[5][6];
doublearr3[7][8];
chararr4[9][10];
```
```cpp
intarr[3][4]={
{0,1,2,3},//初始化第1列
{4,5,6,7},//初始化第2列
{8,9,10,11}//初始化第3列
};
intarr[][]={
{0,1,2,3},//初始化第1列
{4,5,6,7},//初始化第2列
{8,9,10,11}//初始化第3列
};
intarr[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
//與上面兩個宣告方式等效
intarr[3][4]={0};
//arr有3×4個元素,全部皆為0
//注意,這是特殊用法,只有0可以這麼做,其他數值不行
//常用在建表
intarr[3][4];
arr[2][3]=50;
```
###動態宣告
```cpp
intn;
cin>>n;
intarr[n];
```
語法錯誤但IDE(整合開發環境)會接受這種語法,使用上問題很大
尤其是區域記憶體溢出的問題,溢出時會使程式數值錯誤
**所以務必用全域宣告陣列**
```cpp
intarr[50];
intmain
{
//讀取陣列
}
```
如果邊界範圍為N
那麼**陣列的長度建議宣告為N+5**
這是為了**避免陣列溢位**
補充:全域宣告的陣列預設值皆為0
##`char`與`string`
###`char`
####前導:`char`的陣列
`char`就是字元型別,一個字元變數一次可以讀取一個字元
而如果要讀取一句話,或是很多字元的時候
就要用`char`宣告一個`array`
####語法:如何宣告`char`的陣列
`char`的陣列宣告範例如下:
```cpp
charch[1000];
```
####語法:如何初始化`char`陣列
```cpp
charch[3]={'A','B','C'};
//ch有3個元素,分別為A、B、C
charch[]={'A','B','C'};
//ch的元素有A、B、C,程式會自動判斷陣列長度
charch[3]="";
//ch有3個元素,全部皆為'\0'(NULL)
//注意,這是特殊用法,只有char與string型別可以這麼做,其他型別不行
//僅可用"",不可用''
charch[4];
ch[3]=50;
//第4個元素ch[3]='2'
//ASCII碼第50個是數字2
charch[4];
ch[3]='5';
//第4個元素ch[3]='5'
//單個字元的賦值請用''或""將字元框起來
charch[4];
ch[3]='5'+1;
//ch[3]=='6'
//對字元進行操作,等同對ASCII碼的數值進行操作,'5'+1後的ASCII碼便是'6'
charch[10]={"ColtenOrz"};
//ERROR
charch[11]={"ColtenOrz"};
//大於等於兩個字元請用""將字串框起來
//"ColtenOrz"有10個字元
//C++會在字串最後放上'\0'(NULL),因此這個字串共有11個字元,所以陣列大小要為(輸入字元數+1)
charch[]={"ColtenOrz"};
//ch的元素有{'C','o','l','t','e','n','','O','r','z','\0'}
//程式會自動判斷陣列長度
charch[]={'C','o','l','t','e','n','','O','r','z'};
//不等價於charch[]={"ColtenOrz"};
charch[]={'C','o','l','t','e','n','','O','r','z','\0'};
//等價於charch[]={"ColtenOrz"};
```
###`string`
####前導:`string`的用意
不是每句話長度都相同,這樣在宣告上十分不易
於是有一個不需要考慮字元陣列長度的型別,稱作`string`
`string`就是字元陣列,但我們不用知道有多少個字元
####語法:如何宣告`string`
`string`是一種型別
`string`宣告範例如下:
```cpp
stringstr;
```
####語法:如何初始化`string`
```cpp
stringstr1("caterpillar");
//內容為指定的字串常量
stringstr2(str1);
//以str1實例建立字串
stringstr3=str2;
//以str2實例建立字串
stringstr4="Justin";
//內容為指定的字串常量
stringstr5(10,'c');
//建立有10個c的字串
stringstr6="";
//str6為'\0'(NULL)
//注意,這是特殊用法,只有char與string型別可以這麼做,其他型別不行
//僅可用"",不可用''
stringstr7(str2,6,3);
//從str2中的第6個位置開始複製3個字元
//str2="caterpillar"從第6位'p'開始,複製3個字元"pil"初始化str7
stringstr8=str2+"content"+str3;
//混合初始化
stringstr9=str2.substr(3,9);
//從str2中的第3個位置開始複製9個字元
////str2="caterpillar"從第3位't'開始,複製9個字元"terpillar"初始化str9
stringstr10=str2.substr();
//substr的()參數為空則複製整個str2至str10
stringstr11(5,'A');
//複製5個字元A到str11
stringstr12="Hello"+"World";
//ERROR
//用+串接字串時,前兩項須有其中一項為string型別變數
```
補充:stringstr;預設狀態下即為空字串(NULL)
####語法:如何宣告`string`陣列
`string`的陣列宣告範例如下:
```cpp
stringstr[5];
```
####語法:如何初始化`string`陣列
```cpp
stringstr1[3]={"Jack","Colten","Suifeng"};
//宣告有3個字串的陣列
//宣告時用{}括弧住初始化的內容與用""夾著個別字串
stringstr2[5]=""
//str2全為'\0'(NULL)
//注意,這是特殊用法,只有char與string型別可以這麼做,其他型別不行
//僅可用"",不可用''
```
####語法:如何使用`string`陣列
使用字串陣列時,只需要在最後加上`[index]`即可存取字串中的元素
```cpp
stringstr[3]={"Jack","Colten","Suifeng"};
cout<
C++自帶的用法與函數:
```cpp
stringstr;
getline(cin,str);
//得到一整行的輸入,包含空格,遇到換行時終止讀取
str.size();
//得到字串長度
str.length();
//得到字串長度
str[1]='C';
//存取字串的第2個元素,型別為字元
str.at(1)='C';
//存取字串的第2個元素,型別為字元
//會有超出邊界的警告
```
需導入函式庫才可使用的函數:
```cpp
stringstr;
str.empty();
//如果字串為空則回傳True
str.clear();
//清空字串
str.insert();
//在字串中插入字串
stringstr="tobequestion";
stringstr2="the";
stringstr3="ornottobe";
str.insert(6,str2);
//tobethequestion
//在str第6個位置的下一個位置開始插入str2
str.insert(6,str3,3,4);
//tobenotthequestion
//在str第6個位置的下一個位置開始插入str3的部分元素
//從str3第3個位置的下一位開始數4個元素到第7個位置
str.insert(10,"thatiscool",8);
//tobenotthatisthequestion
//在str第10個位置的下一個位置開始插入"thatiscool"的部分元素
//從"thatiscool"的第1個位置開始數8個元素到第8個位置
str.insert(10,"tobe");
//tobenottobethatisthequestion
//在str第10個位置的下一個位置開始插入"tobe"
str.insert(15,1,':');
//tobenottobe:thatisthequestion
//在str第15個位置的下一個位置開始插入1個:字元
str.insert(str.end(),3,'.');
//tobe,nottobe:thatisthequestion...
//從str的最後插入3個.字元
```
##技巧:陣列的應用與注意事項
###建表
在輸入輸出時,題目都會要求輸出一組結果
像是輸入一個數字,要你判斷他是不是質數,因為只有一個數字,所以很簡單
但如果今天有好幾個數字要你判斷,那你勢必要對每個數字進行判斷
這也會造成程式的執行效率低下
倘若今天用建表的方式,只要執行一次就不用重複執行
而建表的概念就是實現輸入一組`index`,**只用`arr[index]`就能得到答案**
b004:一個都不能少
http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=b004
###邊界
在使用陣列時,如果遇到陣列長度為`length`的`arr[i+N]`
即便`i`的值有被嚴格限制在陣列範圍
加上常數`N`後卻很可能因此超出陣列範圍,也就是陣列的邊界
因此,**要更改最大索引值為`length-N-1`以避免超出邊界**
###在邊界外賦值
```cpp
intarr[50];
//邊界為arr[49]
arr[50]=1000;
cout<::operator[]
https://en.cppreference.com/w/cpp/container/array/operator_at
std::array
https://en.cppreference.com/w/cpp/container/array
C++教學
http://tw.gitbook.net/cplusplus/index.html
C++與演算法
https://www.csie.ntu.edu.tw/~b98902112/cpp_and_algo/index.html
C語言字元陣列的定義與初始化
https://www.itread01.com/content/1550203580.html
陣列宣告和賦值總結
https://www.itread01.com/content/1546701490.html
string如何初始化为空?
https://bbs.csdn.net/topics/390692419
string初始化的几种方法
https://blog.csdn.net/allovexuwenqiang/article/details/4277555
C++string(初始化和部分函数的使用)
https://blog.csdn.net/qq_34637408/article/details/71584616
string::insert
http://www.cplusplus.com/reference/string/string/insert/
C++的輸出入cin/cout和scanf/printf誰比較快?
https://chino.taipei/note-2016-0311C-%E7%9A%84%E8%BC%B8%E5%87%BA%E5%85%A5cin-cout%E5%92%8Cscanf-printf%E8%AA%B0%E6%AF%94%E8%BC%83%E5%BF%AB%EF%BC%9F/
×
Signin
Email
Password
Forgotpassword
or
Byclickingbelow,youagreetoourtermsofservice.
SigninviaFacebook
SigninviaTwitter
SigninviaGitHub
SigninviaDropbox
SigninviaGoogle
NewtoHackMD?Signup