作者:王一哲
日期:2023年8月6日
C++ 傳統的陣列 array,可以用來儲存多筆相同格式的資料,儲存這些資料的記憶體位址是連續的,所以讀取資料時,是依據陣列開頭的記憶體位址再加上索引值,索引值由 0 開始。以下是關於 array 的基礎知識。
可以使用所有內建的資料格式,例如 int、float、char、string,也可以使用自訂的資料格式,但是一個 array 當中所有的資料只能是同一種格式。語法通常有以下3種
如果想要使用 memset,需要先引入函式庫 cstring,語法為
例如以下的程式碼
array 沒有回傳長度的功能,通常是用 array 使用的記憶體除以資料格式使用的記憶體,語法為
例如以下的程式碼
語法有兩種
例如以下的程式碼,輸出的值皆為 1。
如果想要産生一個很長的 array,但是資料之間有規律性,通常會使用 for 迴圈填入資料,手動填入資料太麻煩了,例如以下的程式碼,産生的 array 內容為 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}。
如果想要印出 array 的資料,不能使用以下的語法,這樣只會印出 array 的記憶體位址。
通常會使用 for 迴圈配合索引值印出資料,例如以下的程式碼
輸出為
這裡使用了一個小技巧,最後面的 [i == length-1] 是指當方括號中的條件成立時印出換行符號 \n,如果條件不成立時印出空格。因為程式競賽或 APCS 經常會要求這樣輸出答案,用空格分隔資料,但是最後一筆資料直接換行、不加空格。
二維 array 很像把資料分布在 xy 平面上,每筆有兩個索引值,就像是 x、y 座標值。由於二維 array 看起來很像數學中的矩陣,通常會沿用矩陣的講法,將 {{0, 1, 2}, {3, 4, 5}} 這樣的二維 array 稱為 2 列 (row)、3 欄 (column)。産生二維 array 的語法為
如果産生二維 array 時有指定資料可以省略列數,編譯器會自動從指定資料判斷列數,但是欄數不能省略。例如以下的程式碼,a 的內容為 {{0, 1, 2}, {3, 4, 5}},b 的內容為 {{1, 2, 0}, {3, 4, 0}},因為 b 應該有 3 欄,沒有指定的資料自動補 0。
如果要印出二維 array 的內容,也是利用 for 迴圈
輸出為
STL vector 與 array 不同,可以動態地改變容器長度,使用上比較方便。要先引入函式庫,函式庫的官方說明書在此 cplusplus.com std::vector。
vector 的資料可以是所有內建的資料格式,例如 int、float、char、string,也可以使用自訂的資料格式。語法為
例如以下的程式碼
迭代器可以用來取得物件對應的記憶體位址,有以下幾種:
迭代器的變數名稱通常是 it,寫法有兩種,例如以下的程式碼
但是 vector<int>::iterator 只能用在 begin()、end(),還是用 auto 會比較方便。如果要印出陣列中所有的資料,可以配合迭代器處理,例如以下的程式碼
第一種語法為
例如以下的程式碼
第二種語法是由另一個 vector 中指定的記憶體位址複製資料,不包含終點位址。
例如以下的程式碼
第三種語法是由另一個 array 中指定的記憶體位址複製資料,不包含終點位址。
例如以下的程式碼
語法為
例如以下的程式碼
另一個工具是 emplace_back,語法為
看起來效果和 push_back 差不多,但是據說少了複製構造的步驟,所以效率更高。例如以下的程式碼
語法為
要配合迭代器取得記憶體位址,例如以下的程式碼
另一個工具是 emplace,語法為
看起來效果和 instert 差不多,但是據說少了複製構造的步驟,所以效率更高。例如以下的程式碼
語法為
不需要任何參數,沒有回傳值。例如以下的程式碼
如果陣列是空的,會回傳程式記憶體區段錯誤,例如以下的程式碼
語法為
不包含終點位址。例如以下的程式碼
語法為
不需要加上任何參數,清空資料後陣列長度為 0。
語法為
語法為
不需要任何參數。例如以下的程式碼
如果陣列是空的,會回傳 0,例如以下的程式碼
語法為
不需要任何參數。例如以下的程式碼
如果陣列是空的,會回傳程式記憶體區段錯誤,例如以下的程式碼
語法有兩種,分別為
兩者有點差異,例如以下的程式碼
語法為
不需要任何參數,回傳值格式為 size_t,沒有正負號的整數。
語法為
不需要任何參數,回傳值格式為 size_t,沒有正負號的整數。在我使用的系統中回傳值為 2305843009213693951,為 。
語法為
將陣列調整成指定長度,資料參數可省略,預設值為 0。例如以下的程式碼
語法為
不需要任何參數,沒有回傳值。例如以下的程式碼
語法為
不需要任何參數,回傳值格式為 sizt_t。例如以下的程式碼
語法為
不需要任何參數,如果陣列為空回傳 1,如果有資料回傳 0。
二維 vector 很像把資料分布在 xy 平面上,每筆有兩個索引值,就像是 x、y 座標值。由於二維 vector 看起來很像數學中的矩陣,通常會沿用矩陣的講法,將 {{0, 1, 2}, {3, 4, 5}} 這樣的二維 vector 稱為 2 列 (row)、3 欄 (column)。産生二維 vector 的語法為
如果使用第一種語法,通常搭配 for 迴圈及 push_back 填入資料,例如以下的程式碼
v 的內容為
如果使用第二種語法,可以將資料寫在同一行,也可以將不同列的資料寫在不同行讓欄位對齊,例如以下的程式碼
v 的內容為
vector 與 array 不同之處,vector 並沒有要求每列的欄數相同,例如以下的程式碼
v2 的內容為
如果要印出二維 vector 的內容,也是利用 for 迴圈搭配索引值或是迭代器,例如以下的程式碼
輸出為
以上是我目前常用到的 array 及 vector 功能,如果之後有遇到其它需求會再補充內容。
C++