順序儲存結構的線性表存在著兩個方面的問題:
功能方面:陣列操作符的過載,線性表有可能被誤用為陣列使用
效率方面:在一些場合中,效率上是有隱患的
解決方案:當前的庫中沒有可以代替原生陣列的實現,所以有可能會被誤用,需要建立乙個陣列類代替原生陣列。
需求分析:建立陣列類代替原生陣列的使用
array
設計要點:
array
類的宣告
templateclass array : public object
template class array : public object
return ret;
}virtual bool get(int i, t& e)
return ret;
}virtual int length() const = 0;
// 陣列訪問操作符
t& operator (int i)
else
}t operator (int i) const
};
staticarray
設計要點:類模板
template < typename t, int n >
class staticarray : public array;
template < typename t, int n >
class staticarray : public array
// 拷貝構造和賦值操作
staticarray(const staticarray& obj)
}staticarray& operator = (const staticarray& obj)
}return *this;
}int length() const
};
4、dynamicarray類模板建立
staticarray
的物件,陣列的大小是明確指定的,建立動態陣列類模板,陣列大小可以動態指定
dynamicarray
設計要點:類模板
dynamicarray
類的宣告:
template < typename t >
class dynamicarray : public array;
template < typename t >
class dynamicarray : public array
else
}dynamicarray(const dynamicarray& obj)
}else
}dynamicarray& operator = (const dynamicarray& obj)
// 拷貝完就設定
t* temp = this->m_array;
this->m_array = array;
this->m_length = obj.m_length;
delete temp;
// 保證異常安全
}else
}return *this;
}int length() const
void resize(int length) // 動態重置陣列的長度
t* temp = this->m_array;
this->m_array = array;
this->m_length = length;
delete temp;
}else}}
~dynamicarray()
};
5、**優化
分析建構函式、拷貝建構函式、賦值操作符過載函式和resize
函式,程式邏輯為:
建構函式:
拷貝建構函式:
賦值操作符過載函式:
resize
函式:
總結:賦值操作符過載和resize
**中有很多重複的邏輯, 建構函式和拷貝建構函式也有很多重複**,如何進行**優化
重複**邏輯的抽象
void init(t* array, int length)
else
}
t* copy(t* array, int len, int newlen)
}else
return ret;
}
void update(t* array, int length)
else
}
這三個函式均放在protected
成員函式內
於是**簡化為:
public:
dynamicarray(int length)
dynamicarray(const dynamicarray& obj)
dynamicarray& operator = (const dynamicarray& obj)
return *this;
}int length() const
void resize(int length) // 動態重置陣列的長度
~dynamicarray()
6、總結staticarray
通過封裝原生陣列的方式實現陣列類
dynamicarray
動態申請堆空間,使得陣列長度動態可變陣列物件能夠代替原生陣列,並且使用上更安全
**優化是專案開發過程中不可或缺的環節
陣列的新玩法,建立陣列類。
陣列的新玩法,建立陣列類。c語言中的陣列不好用嗎?為什麼需要陣列類?仔細思考一下,原生陣列有缺點嗎?額,還真有!在使用陣列的時候,使用者想要獲取陣列的長度是比較麻煩,如果不清楚函式引數傳遞的規則,使用函式來求陣列長度,得到的必然是錯誤的結果。比如 include using namespace st...
C Array類 建立陣列
除了使用c 語法 建立陣列之外,還可以使用靜態方法 createinstance 建立陣列。舉個例子 array intarray1 array.createinstance typeof int 5 for int i 0 i 5 i for int i 0 i 5 i 在這個例子中,演示了如何建...
C Array類 建立陣列
c 中建立陣列,常見的例如 int array new int 5 除了使用c 語法 建立陣列之外,還可以使用靜態方法createinstance 建立陣列。array test array.createinstance typeof int 5 for int i 0 i test length ...