CStringArrayでの二次元配列 – プログラミング – Home

CStringArrayでの二次元配列
 
通知
すべてクリア

CStringArrayでの二次元配列


riku
 riku
(@riku)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

CStringArrayで要素数を追加するメソッドが、Addであるのは分かるのですが、
これを二次元配列で使用したいとき、レコード数を増やすには、どのように
すればいいのでしょうか?

#なんか、あまりにも素人的で簡単そうな質問のような気がするのですが、
#なぜか悩んではまっています。どなたかご教授ください。


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

CArray<CStringArray,CStringArray&>
とかでお茶を濁しますか...
# 濁せるかな?


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

濁せないようです。

CStringArrayはoperator=が無いって怒られます。

CObject派生のコレクションは全滅するので,

std::vector<std::vector<std::string> >

とか,

std::vector<std::vector<CString> >

にする必要があるみたいです。

#CArray<std::vector<CString>, std::vector<CString>&>ってのも何か違うし……。


返信引用
riku
 riku
(@riku)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

お茶の濁し方が分かりません(+_+)
単純にCStringArrayのメソッドでちょこちょことやる訳には
いかないことは分かりました

CSVファイルを読み込み、それを二次元配列に格納する関数を
作成しようとしています。その二次元配列のポインタを戻り値に
しようとしています。
CSVは、項目数(要素数)は決まっていますが、レコード数は
不確定です。

CStringArrayは、アクセスが簡単そうなことと、動的な配列確保が
簡単にできそうなんで使おうと思いました。

何か、いい方法はありますでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

僕だったら vector< vector<string> > でさらっと逃げますが^^;


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

最終的に二次元配列メモリ領域のポインタを返す必要があるなら、
vector< vector<string> > 等は使えないですよね。
これは配列の配列ですから…


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 最終的に二次元配列メモリ領域のポインタを返す必要があるなら、
> vector< vector<string> > 等は使えないですよね。
> これは配列の配列ですから…

御意。でもそんな要求はないんでしょ? > rikuさん


返信引用
riku
 riku
(@riku)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

> 御意。でもそんな要求はないんでしょ? > rikuさん

と言われると微妙です。
その格納した配列を呼び元で使えれば問題ないです。
他の関数にもそれを渡して使用したいと考えています。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> その格納した配列を呼び元で使えれば問題ないです。
> 他の関数にもそれを渡して使用したいと考えています。

いや、そーゆーことじゃなくてぇ ^^;

二次元配列の内部表現がメモリ上で'連続した領域'に
配置されたものである必要があるか? です。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

以前私もそのような事で悩んだことがありました。
要素数が決まっているということですので、こんな感じでいかがでしょう?

決まった数の要素をもつクラスを作成してCArrayで利用する。
(コピーコンストラクタとoperator=を実装しないといけませんが。)

手持ち技の少ない私はコレで回避しました。

まぁ、中身が文字列だけだったので、επιστημηさんがおっしゃっている vector<
vector<string> >が楽だったと今では思います。←その頃はSTLなんて知らなかったもので


返信引用
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

これはありでしょうか?

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];


返信引用
riku
 riku
(@riku)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

>επιστημη様
> 二次元配列の内部表現がメモリ上で'連続した領域'に
> 配置されたものである必要があるか? です。

すいません。内部表現と言う意味がイマイチ分からないんですが、
配列の先頭ポインタを渡すことによって、そのStringの配列が
参照できれば、なんでもいいです。

>ひろぴー様
> 決まった数の要素をもつクラスを作成してCArrayで利用する。
> (コピーコンストラクタとoperator=を実装しないといけませんが。)

初め、それを考えたんですが、もっと簡単に扱えないかと思いまして。
今のところ私もかなり手持ち技が少ないです。
(だからεπιστημηさんの質問にも的確に回答することができない…。)

実はさっきからvectorなるものの使い方を調べているのですが、
STL知らないとだめなんですかね?
#あぁ、もっと技が欲しい…。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 決まった数の要素をもつクラスを作成して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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました