たぶん週刊「今週の進捗」

1週間に勉強したことや実装したことをネタに、週に1回(主に土日に)更新していく予定です。「多分」なので、臨時休刊があってもご海容ください。

メモ(C++)

ちょっとC++でプログラミングする機会があったので自分用にメモしておこう。

定数以外で長さを指定された配列

所謂 C言語でのmalloc()で動的確保したいケース。

int length;
cin >> length;
int *array;
array = new int[length];

delete[] array;

2次元の配列の場合。

int length1=33, length2=4;
int **array2d;
array2d = new int*[length1];
for(int i=0; i<length1; i++)
    array2d[i] = new int[length2];

for(int i=0; i<length1; i++)
    delete[] array2d[i];
delete[] array2d;

std::vector

C++でリスト構造をあれこれしようと思ってググっていたら、リストと同様に使える std::vector なる便利なものがあるらしい。

std::vector<Circle> circle_vector;

while (System::Update())
{
	// マウスが左クリックされたら、新しく円を追加
	if (Mouse::LeftClicked())
		circle_vector.push_back(Circle( Mouse::Pos(), 20));

	// vector 内の全要素を描画
	int vector_length = circle_vector.size();

	// イテレータで参照する場合
	std::vector<Circle>::iterator itr = circle_vector.begin();
	for (int i = 0; i < vecotr_length; i++){
		(*itr).draw(Palette::Crimson);
		itr++;
	}

        // インデックスを指定して参照する場合
	for (int i = 0; i < ex_circle_vector_length; i++)
		circle_vector[i].draw(Palette::Crimson);
}

このイテレータを使ったループの書き方はよろしくなかった。
後で勉強しなおしておこう。

for( std::vector<Circle>::iterator itr = cicle_vector.begin(); i!=circle_vector.end(); ++itr)
    (*itr).draw(Palette::Crimson);