私は C++ の経験豊富なプログラマーではなく、解決できない問題があります。私が取り組んでいるプロジェクトはかなり大きいので、ここにすべてのコードを掲載することはできません。コードが多すぎて、説明が多すぎます。コードのごく一部、つまり問題を引き起こす部分だけを書いているので、それで十分だと思います。質問が長くて申し訳ありませんが、投稿されたすべてのコードについて説明したいと思います。コードのこの部分だけでは問題を解決できないかもしれませんが、試してみたいと思います。
まず、「record」という構造体があります。
struct record {
vector<string> dataRow;
vector<string *> keys;
vector<string *> values;
void setDataRow(vector<string> r) {
dataRow = r;
}
}
文字列データの一部はキーとしてマークされ、その他は値としてマークされます。次の処理では、すべての文字列データを 1 つのベクトルに収めたほうがよいため、文字列のベクトル (ベクトル キー、ベクトル値) を 2 つ持たないのはそのためです。
それから私はこれを持っています:
vector< vector<record> > resultSet;
vector はデータ テーブルのようなものです - 文字列データを含む行のセットです。これらのテーブルの特定の数が必要なので、レコードのベクトルのベクトルです。テーブルの数はオプションなので、テーブル数を設定するときは予約関数でテーブルを準備します。
resultSet.reserve(count);
for(unsigned int i = 0; i < count; i++) {
vector<record> vec;
resultSet.push_back(vec);
}
新しいレコードをresultSetに追加したいとき、レコードを挿入する必要があるテーブルの数を知っています。resultSet[number].push_back(rec) の後、push_back() は他のメモリアドレスに「dataRow」の値を持つ「rec」の新しいコピーを作成するため、ベクトル「キー」と「値」のポインターを変更する必要がありますよね? だから私は push_back を行い、ポインタを更新するこの関数を持っています:
void insert(int part, vector<string> & dataRow) {
record r;
r.setDataRow(dataRow);
resultSet[part].push_back(r);
int pos = resultSet.size() - 1; // position of last record
resultSet[part].at(pos).values.clear();
resultSet[part].at(pos).keys.clear();
for(unsigned int i = 0; i < dataRow.size(); i++) {
record * newRec = &resultSet[part].at(pos);
if(isValue(dataRow[i])) {
newRec->values.push_back(&(newRec->dataRow.at(i)));
// control cout...
} else {
newRec->keys.push_back(&(newRec->dataRow.at(i)));
// control cout...
}
}
}
これは機能しています。newRec で push_back した後、挿入されたポインターとそれらの参照値の cout を制御しましたが、すべて問題ありませんでした。
しかし!何回か挿入した後、関数 processData(resultSet) を呼び出します。この関数は、resultSet 内のすべてのデータを処理する必要があります。od データの処理を実装する前に、制御用のすべてのキーを出力して、すべてが問題ないかどうかを確認したかっただけです。このコード:
for(unsigned int i = 0; i < resultSet.size(); i++) {
for(unsigned int j = 0; j < resultSet[i].size(); j++) {
cout << "keys: ";
for(unsigned int k = 0; k < resultSet[i].at(j).keys.size(); k++) {
cout << *resultSet[i].at(j).keys.at(k) << ", ";
}
cout << endl;
}
}
悪いです(レコードの値ベクトルを印刷する場合と同じ問題)。アクセス違反読み込みの例外をスローします。アクセスできないメモリを読み込もうとすると、この例外がスローされることはわかっていますよね? なぜうまくいかないのか本当にわからないので、上記のコードに誤りがあることを教えてください。resultSet を処理する前に、数回の挿入を除いて、resultSet で何もしません。
読んでくれてありがとう。