復習 - 動的配列マネージャー
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 17/104。
チャレンジ
簡単独自のメモリを管理し、必要に応じて自動的に拡張するDynamicArrayクラスを構築しましょう。これは、std::vectorが内部で動作する仕組みと同じです。
コードを整理するために、2つのファイルを作成します。
DynamicArray.h: 動的サイズの整数のarrayを管理するDynamicArrayクラスをdefineします。クラスには次の要素が必要です。- Privateメンバー:data
arrayへのポインター、Current size(要素数)、およびcapacity(Allocated space) - initial capacityを受け取り、ヒープ上に
arrayをallocatesし、sizeを0にinitializesするConstructor - Allocated memoryをfreesし、
"DynamicArray destroyed"を表示するDestructor push(int value)メソッド。arrayにelementをAddします。arrayがfullの場合は、新しくより大きなarrayをallocatesし、existing elementsをCopyingしてからoldarrayをFreeingすることで、capacityをdoubleにしますget(size_t index)メソッド。given indexのelementを返しますgetSize()メソッド。Current elementsのnumberを返しますgetCapacity()メソッド。Current capacityを返します
- Privateメンバー:data
main.cpp: initial capacityとAddするvaluesの数を読み取ります。次に、その数のintegersを読み取り、それぞれをDynamicArrayにpushします。all valuesをAddした後、次を表示します。"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(all elementsをspacesで区切る)
input formatは次のとおりです。
- First line: initial capacity(integer)
- Second line: Addするvaluesの数(integer)
- Following lines: 1行につき1つのinteger value
resizing時、arrayはcapacityをdoubleにする必要があります。たとえば、capacity 2で開始してthird elementをpushした場合、capacityは4になります。これはRAII principleを示しています。クラスはConstructorでmemoryをacquiresし、Destructorでそれをreleasesするため、memory leaksが発生しません。
#include "DynamicArray.h"を使用して、header fileをmain.cppにincludeしてください。
自分で試してみよう
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// 初期容量を読み取る
int initialCapacity;
cin >> initialCapacity;
// 追加する値の数を読み取る
int numValues;
cin >> numValues;
// TODO: Create a DynamicArray with the initial capacity
// TODO: numValues個の整数を読み取り、それぞれを配列にプッシュする
// TODO: "Size: <size>"を出力する
// TODO: "Capacity: <capacity>"を出力する
// TODO: "Elements: <e1> <e2> ..."を出力する(すべての要素をスペースで区切る)
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ