【C++】多次元ベクトルクラスを作る

公開日: : 最終更新日:2014/08/14 C/C++

スポンサーリンク

3次元ベクトルクラスや2次元ベクトルクラスを作るときは内部のデータとして静的な配列を使えば問題ありませんでした。

しかし、次元数が不確定な多次元ベクトルクラスを作るには動的に配列を確保する必要があるのですが、この辺はちょっと間違えるとメモリリークの原因となってしまいます。

具体的にはコピーコンストラクタ代入演算子のオーバーロードデストラクタをちゃんと定義する必要があります。

#include<stdio.h>
#include<string.h>
//多次元ベクトルクラス
class VectorClass
{
public:
	VectorClass(int length)
	{
		this->length=length;
		value = new double[ length ];
		memset(value,0,length*sizeof(double));
	}
	//コピーコンストラクタ
	VectorClass(const VectorClass& v)
	{
		length = v.length;
		value = new double[ length ];
		memcpy(value,v.value,length*sizeof(double));
	}
	//デストラクタ
	~VectorClass(void)
	{
		delete[] value;
		value = NULL;
	}
	void set(int index,double value)
	{
		this->value[ index ] = value;
	}
	double get(int index) const{ return value[ index ]; }
	int size(void) const{ return length; }
	//和をとる
	VectorClass operator+(const VectorClass& v) const
	{
		VectorClass dst(length);
		for(int i=0;i<length;i++){
			dst.value[i] = value[i]+v.value[i];
		}
		return dst;
	}
	//出力テスト
	void print(void) const
	{
		printf("(");
		for(int i=0;i<length;i++)
		{
			printf("%f",value[i]);
			if(i<length-1){ printf(","); }
		}
		printf(")\n");
	}
	//代入演算子オーバーロード
	VectorClass& operator=(const VectorClass& v)
	{
		delete[] value;
		length = v.length;
		value = new double[ length ];
		memcpy(value,v.value,length*sizeof(double));
		return *this;
	}
private:
	VectorClass(void){} //禁止しておく
	double *value;
	int length;
};
int main(void)
{
	int dim = 4;
	VectorClass v1(dim),v2(dim);
	for(int i=0;i<4;i++)
	{
		v1.set(i,i);
		v2.set(i,i*2);
	}
	VectorClass dst = v1 + v2;
	v1.print();
	v2.print();
	dst.print();
}
(0.000000,1.000000,2.000000,3.000000)
(0.000000,2.000000,4.000000,6.000000)

上の例では和をとるだけの関数しか用意していませんが、コピーコンストラクタ、代入演算子のオーバーロード、デストラクタ内では配列のコピーや解放などを行っています。
また、memsetは配列の初期化、memcpyは配列のコピーを行います。

代入演算子のオーバーロードで自分自身の参照(VectorClass&)を返しているのは

VectorClass v1(4),v2(4),v3(4);
~~
v1 = v2 = v3;

のように連続して代入できるようにするためです。別にvoidとかにしてもこういう使い方をしなければ動きます。

なお、この例では型をdoubleとしましたが、実際はテンプレートを使った方が型を後から定義できて便利ですのでそちらをお勧めします。

スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

【C言語/C++】fgetsを使ってファイルを読み込む

fgetsで単純にファイルを読み取る C言語、C++でfgetsを使ってファイルを読み込む方法です

記事を読む

【C言語/C++】関数の宣言・定義まとめ

1 関数プロトタイプ宣言・定義 1-1 プロトタイプ宣言 1-2 定義 2 ファイ

記事を読む

【C++】行列演算ライブラリEigen

デフォルトのCやC++には行列やベクトルなどの演算ライブラリはありません。なので行列計算などをしよう

記事を読む

【C言語/C++】コンソールでAAアニメーション

コンソール上でAA(アスキーアート)のアニメーションをさせます。 手順としては

記事を読む

no image

【C++】文字列のcontainsメソッドによる比較

C++/CLIなどではStringのContainsメソッドが便利ですが、純粋なC++のstring

記事を読む

【C言語/C++】はてなの演算子の三項演算子について

C言語などのサンプルにたまに出てくるはてな(?)の演算子は 『?』と『:』の2つで1つの演算子であ

記事を読む

【C++/CLI】フォームアプリケーションでコンソール画面を出現させる

プロジェクトのプロパティを開いて「構成プロパティ」→「リンカ」→「システム」の「サブシステム」を「コ

記事を読む

コンソールアプリケーションでC++/CLIの関数を使う

今時(?)なかなか使っている人がいるかどうかわかりませんが、VisualStudio(2008)で「

記事を読む

【C言語】fopenが失敗するエラー

ファイル操作に使うfopenがどうしても失敗してしまい困っていました。既に開かれているファイルを開く

記事を読む

OpenCVで矢印を描画する

OpenCVで矢印を描画するという関数が無いみたいだったので作りました。書いていることは参考リンク先

記事を読む

NVIDIA DIGITSをSupervisorを使って自動起動する

はじめに 先日Ubuntu14.04にDIGITS 5をGPUなしP

【2017年度】GeForce 1080 Ti搭載BTOパソコン比較

はじめに 最近ディープラーニング用にGPUのないPCにDIGITSを

Windows用のシンプルなストップウォッチソフト紹介

Windows(10)でも使える使いやすいKAZAMITimerという

MNISTをDIGITS 5のCPUのみで試す(GPUなし)

はじめに DIGITSを使えばGUI操作で簡単にディープラーニングが

Windowsユーザが初めてMacBookを購入したときの注意点や感想

最近12インチのMacBookを購入しました。今までWindowsしか

Redmine3.2をUbuntu14.04にインストールして躓いた所についてメモ

はじめに Ubuntu14.04 ServerにRedmine3.2

UWSCを使ったソフト自動立ち上げ【SoftEther VPN Server】

やりたいこと 最近SoftEtherという筑波大学発のベンチャー企業

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑