まとめ:動的配列マネージャー
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 17/104。
チャレンジ
簡単必要に応じて自動的に拡張される、独自のメモリを管理する DynamicArray クラスを作成しましょう。これは、内部で std::vector が動作する仕組みと同じです!
コードを整理するために、2つのファイルを作成します:
DynamicArray.h: 整数型の動的サイズ配列を管理するDynamicArrayクラスを定義します。クラスには以下のものを含める必要があります:- プライベートメンバ:データ配列へのポインタ、現在のサイズ(要素数)、およびキャパシティ(割り当てられたスペース)
- 初期キャパシティを受け取り、ヒープ上に配列を割り当て、サイズを0に初期化するコンストラクタ
- 割り当てられたメモリを解放し、
"DynamicArray destroyed"と出力するデストラクタ - 配列に要素を追加する
push(int value)メソッド。配列がいっぱいの場合、新しいより大きな配列を割り当て、既存の要素をコピーし、古い配列を解放することで、キャパシティを2倍にする必要があります - 指定されたインデックスの要素を返す
get(size_t index)メソッド - 現在の要素数を返す
getSize()メソッド - 現在のキャパシティを返す
getCapacity()メソッド
main.cpp: 初期キャパシティと追加する値の数を読み取ります。次に、その数だけ整数値を読み取り、それぞれを DynamicArray にpushします。すべての値を追加した後、以下を出力してください:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(すべての要素をスペースで区切って表示)
入力形式は以下の通りです:
- 1行目:初期キャパシティ(整数)
- 2行目:追加する値の数(整数)
- 続く行:1行につき1つの整数値
リサイズ時、配列のキャパシティは2倍にする必要があります。例えば、キャパシティ2で開始し、3つ目の要素を push した場合、キャパシティは4になるはずです。これは RAII 原則を示しています。クラスはコンストラクタでメモリを取得し、デストラクタでそれを解放することで、メモリリークが発生しないようにします。
main.cpp で #include "DynamicArray.h" を使用してヘッダーファイルをインクルードしてください。
自分で試してみよう
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// 初期容量を読み込む
int initialCapacity;
cin >> initialCapacity;
// 追加する値の数を読み込む
int numValues;
cin >> numValues;
// TODO: initialCapacity を使用して DynamicArray を作成する
// TODO: numValues 個の整数を読み込み、それぞれを配列に push する
// TODO: "Size: <size>" を出力する
// TODO: "Capacity: <capacity>" を出力する
// TODO: "Elements: <e1> <e2> ..." (すべての要素をスペース区切りで)を出力する
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス