MFCのメモ

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

MFCのメモ

投稿記事 by バグ » 14年前

MFCのCListとかCArrayみたいなやつら、なんとなく胡散臭くて(ひどい)ほとんど使ったことなかったんですが、ちょっとお試しで使ってみたんですよ。

CListのGetAtはインデックスで指定するのではなく、POSITION型で位置(多分アドレス?)を指定するという形式でありまする。このPOSITION型の中身ってSTLでいうところのイテレータっぽい?

ただし、イテレータみたいに、++演算子で次の要素へ移動というのが出来ないっぽい・・・。むぅ、これは微妙に使いづらいかも。

先頭と最後尾の位置を取得する関数は用意されてるんだけど、N番目の位置みたいなのはちょっと工夫が必要になるっぽい。

ListというよりはQueueやStackみたいな使い方だったらバッチリはまりそうな感じかな?要するに配列みたいに使いたければ後述のCArrayを使えってことなんだろうね。

それに対してCArrayクラスのGetAtはインデックスで指定できるのでstd::vectorチックな使い方でOKっぽい。これは何気に便利だ。

CODE:


CArray intArray;
intArray.RemoveAll();
for (INT i = 0; i < 100; ++i)
{
	intArray.Add(i);
}

INT test[100] = {0, };
for (INT i = 0; i < intArray.GetSize(); ++i)
{
	test[i] = intArray.GetAt(i);
}

CArrayクラスへ0~99の値をつっこんでいき、それをINT型配列へコピーしているだけのサンプル。
なんとなく使い方は分かると思う。使い勝手も悪くないので今後は使っていこう。

ちなみに、CStringに関してはCStringArray、CStringListなど専用のArrayやListが用意されていたりする。CArrayやCListを使用してもあまり使い勝手は変わらないような気がするんだけど、何か理由があって用意されてるんだろうな・・・分からないから、私は好みで使い分けようと思ってたりしますw

せっかくなので、もう少しマシなサンプルを・・・

CODE:


VOID SplitCsvString(CString data, CStringArray& strArray)
{
	// バッファクリア
	strArray.RemoveAll();

	// カンマで文字列を分割していく
	INT id = 0;
	while ((id = data.Find(CString(","), 0)) != -1)
	{
		CString tmp = data.Mid(0, id);
		strArray.Add(tmp);
		data = data.Mid(id + 1);
	}

	// 文字列の残りがある場合はリストへ追加する
	if (data.GetLength() != 0)
	{
		strArray.Add(data);
	}
}

カンマ区切りのデータ文字列をカンマをデリミタとして分解してCStringArrayに格納する関数です。
うーむ、やっぱり大した物にはならなかったかw

コメントはまだありません。