CStringArrayで要素数を追加するメソッドが、Addであるのは分かるのですが、
これを二次元配列で使用したいとき、レコード数を増やすには、どのように
すればいいのでしょうか?
#なんか、あまりにも素人的で簡単そうな質問のような気がするのですが、
#なぜか悩んではまっています。どなたかご教授ください。
CArray<CStringArray,CStringArray&>
とかでお茶を濁しますか...
# 濁せるかな?
濁せないようです。
CStringArrayはoperator=が無いって怒られます。
CObject派生のコレクションは全滅するので,
std::vector<std::vector<std::string> >
とか,
std::vector<std::vector<CString> >
にする必要があるみたいです。
#CArray<std::vector<CString>, std::vector<CString>&>ってのも何か違うし……。
お茶の濁し方が分かりません(+_+)
単純にCStringArrayのメソッドでちょこちょことやる訳には
いかないことは分かりました
CSVファイルを読み込み、それを二次元配列に格納する関数を
作成しようとしています。その二次元配列のポインタを戻り値に
しようとしています。
CSVは、項目数(要素数)は決まっていますが、レコード数は
不確定です。
CStringArrayは、アクセスが簡単そうなことと、動的な配列確保が
簡単にできそうなんで使おうと思いました。
何か、いい方法はありますでしょうか?
僕だったら vector< vector<string> > でさらっと逃げますが^^;
最終的に二次元配列メモリ領域のポインタを返す必要があるなら、
vector< vector<string> > 等は使えないですよね。
これは配列の配列ですから…
> 最終的に二次元配列メモリ領域のポインタを返す必要があるなら、
> vector< vector<string> > 等は使えないですよね。
> これは配列の配列ですから…
御意。でもそんな要求はないんでしょ? > rikuさん
> 御意。でもそんな要求はないんでしょ? > rikuさん
と言われると微妙です。
その格納した配列を呼び元で使えれば問題ないです。
他の関数にもそれを渡して使用したいと考えています。
> その格納した配列を呼び元で使えれば問題ないです。
> 他の関数にもそれを渡して使用したいと考えています。
いや、そーゆーことじゃなくてぇ ^^;
二次元配列の内部表現がメモリ上で'連続した領域'に
配置されたものである必要があるか? です。
以前私もそのような事で悩んだことがありました。
要素数が決まっているということですので、こんな感じでいかがでしょう?
決まった数の要素をもつクラスを作成してCArrayで利用する。
(コピーコンストラクタとoperator=を実装しないといけませんが。)
手持ち技の少ない私はコレで回避しました。
まぁ、中身が文字列だけだったので、επιστημηさんがおっしゃっている vector<
vector<string> >が楽だったと今では思います。←その頃はSTLなんて知らなかったもので
これはありでしょうか?
CArray<CString *, CString *> array;
CString *a;
a=new CString[5];
array.Add(a);
a=new CString[7];
array.Add(a);
array[0][0]=ABC;
array[0][1]=DEF;
array[1][6]=GHI;
TRACE(%s\n, array[0][0]);
TRACE(%s\n, array[0][1]);
TRACE(%s\n, array[1][6]);
for(int i=0;i<array.GetSize();i++)
delete [] array[i];
>επιστημη様
> 二次元配列の内部表現がメモリ上で'連続した領域'に
> 配置されたものである必要があるか? です。
すいません。内部表現と言う意味がイマイチ分からないんですが、
配列の先頭ポインタを渡すことによって、そのStringの配列が
参照できれば、なんでもいいです。
>ひろぴー様
> 決まった数の要素をもつクラスを作成してCArrayで利用する。
> (コピーコンストラクタとoperator=を実装しないといけませんが。)
初め、それを考えたんですが、もっと簡単に扱えないかと思いまして。
今のところ私もかなり手持ち技が少ないです。
(だからεπιστημηさんの質問にも的確に回答することができない…。)
実はさっきからvectorなるものの使い方を調べているのですが、
STL知らないとだめなんですかね?
#あぁ、もっと技が欲しい…。
> 決まった数の要素をもつクラスを作成してCArrayで利用する。
> (コピーコンストラクタとoperator=を実装しないといけませんが。)
これをふまえて:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 決まった数の要素をもつクラス
template<typename T, size_t N>
struct fixed {
T data[N];
T& operator[](int n) { return data[n]; }
};
int main() {
typedef fixed<std::string,3> row;
std::vector<row> table;
for ( int i = 0; i < 4; ++i ) {
row x;
x[0] = std::string(A) + static_cast<char>(i+'0');
x[1] = std::string(B) + static_cast<char>(i+'0');
x[2] = std::string(C) + static_cast<char>(i+'0');
table.push_back(x);
}
for ( int i = 0; i < table.size(); ++i ) {
for ( int j = 0; j < 3; ++j ) {
std::cout << table[i][j] << ' ';
}
std::cout << std::endl;
}
return 0;
}
--- 実行結果 --
A0 B0 C0
A1 B1 C1
A2 B2 C2
A3 B3 C3