CListのGetAtはインデックスで指定するのではなく、POSITION型で位置(多分アドレス?)を指定するという形式でありまする。このPOSITION型の中身ってSTLでいうところのイテレータっぽい?
ただし、イテレータみたいに、++演算子で次の要素へ移動というのが出来ないっぽい・・・。むぅ、これは微妙に使いづらいかも。
先頭と最後尾の位置を取得する関数は用意されてるんだけど、N番目の位置みたいなのはちょっと工夫が必要になるっぽい。
ListというよりはQueueやStackみたいな使い方だったらバッチリはまりそうな感じかな?要するに配列みたいに使いたければ後述のCArrayを使えってことなんだろうね。
それに対してCArrayクラスのGetAtはインデックスで指定できるのでstd::vectorチックな使い方でOKっぽい。これは何気に便利だ。
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);
}
なんとなく使い方は分かると思う。使い勝手も悪くないので今後は使っていこう。
ちなみに、CStringに関してはCStringArray、CStringListなど専用のArrayやListが用意されていたりする。CArrayやCListを使用してもあまり使い勝手は変わらないような気がするんだけど、何か理由があって用意されてるんだろうな・・・分からないから、私は好みで使い分けようと思ってたりしますw
せっかくなので、もう少しマシなサンプルを・・・
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);
}
}
うーむ、やっぱり大した物にはならなかったかw