一、數組的定義和基本操作
數組是一組相同類型的數據元素按照一定順序排列形成的數據結構,可以通過下標快速訪問和操作其元素。數組定義格式如下:
數據類型 數組名[數組長度];
數組也可以使用指針來訪問和操作其元素,如下所示:
*(數組名 + 下標) = value;
value = *(數組名 + 下標);
其中下標從0開始計數。數組的初始化可以在定義時進行,也可以單獨進行,如下所示:
數據類型 數組名[數組長度] = {元素1, 元素2, ..., 元素n};
數組名[下標] = value;
二、數組越界問題
數組越界是指嘗試訪問或操作數組中不存在的元素。這種情況可能會導致程序崩潰或者產生奇怪的結果。為了避免數組越界,我們需要保證數組下標在合法的範圍內。
可以在程序中使用assert函數來判斷數組下標是否越界,如下所示:
#include <cassert>
int array[10];
int index = 11;
assert(index >= 0 && index < sizeof(array)/sizeof(int));
array[index] = 0; // 會報錯
如果下標值小於0或者大於等於數組長度,assert函數會導致程序停止執行,並輸出錯誤信息。
三、數組相關演算法
1. 計算數組元素個數
可以使用sizeof函數計算數組的長度,然後除以單個元素的位元組數,如下所示:
int array[10];
int size = sizeof(array) / sizeof(int);
其中sizeof(array)得到的是整個數組的位元組數,然後除以sizeof(int)得到了數組的元素個數。
2. 數組排序
可以使用STL中的sort函數對數組進行排序,如下所示:
#include <algorithm>
int array[10];
sort(array, array+sizeof(array)/sizeof(int));
其中sort函數需要兩個參數,第一個參數是數組的起始位置,第二個參數是數組的結束位置。sort函數可以對C++內置類型數據進行排序。
3. 數組查找
可以使用STL中的find函數在數組中查找指定的元素,如下所示:
#include <algorithm>
int array[10];
int* p = find(array, array+sizeof(array)/sizeof(int), 5);
if(p != array+sizeof(array)/sizeof(int)){
// 找到了
}
其中find函數也需要兩個參數,第一個參數是數組的起始位置,第二個參數是數組的結束位置。find函數返回的是指向查找到的元素的指針,如果找不到,返回的指針指向數組結束的位置。
四、利用模板實現數組的封裝
為了提高代碼的可讀性和可維護性,可以使用模板實現數組的封裝。模板使得數據結構和演算法的實現和使用分離,可以避免重複編寫類似的代碼。
數組封裝的實現可以通過類模板來完成,如下所示:
template <typename T, int size>
class Array{
public:
Array(){}
T& operator[](int index){
assert(index >= 0 && index < size);
return m_array[index];
}
private:
T m_array[size];
};
其中template關鍵字表示這是一個類模板,typename T表示參數類型T,int size表示數組大小。Array類有一個成員函數operator[],可以用來訪問數組元素,內部使用assert函數來判斷數組下標是否越界。
使用這個類模板可以定義不同類型、不同大小的數組,如下所示:
Array<int, 10> intArray;
Array<float, 20> floatArray;
intArray[0] = 10;
int value = intArray[0];
五、完整代碼示例
#include <iostream>
#include <cassert>
#include <algorithm>
using namespace std;
template <typename T, int size>
class Array{
public:
Array(){}
T& operator[](int index){
assert(index >= 0 && index < size);
return m_array[index];
}
int size(){
return sizeof(m_array) / sizeof(T);
}
void sort(){
std::sort(m_array, m_array+size());
}
T* find(const T& value){
return std::find(m_array, m_array+size(), value);
}
private:
T m_array[size];
};
int main(){
Array<int, 10> array;
array[0] = 5;
array[1] = 3;
array[2] = 2;
array[3] = 7;
cout << "size: " << array.size() << endl;
array.sort();
int* p = array.find(2);
if(p != array+array.size()){
cout << *p << endl;
}
return 0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/241991.html