我在 C++ 方面不是很有经验的程序员,我有一个我无法解决的问题。我正在从事的项目很大,所以我不能在这里发布所有代码。这是太多的代码和太多的解释。我只写了一小部分代码,这部分给我带来了问题,所以我希望它就足够了。很抱歉我的问题很长,但我想解释所有发布的代码。也许这部分代码不足以解决问题,但我想尝试一下。
首先,我有一个名为“record”的结构:
struct record {
vector<string> dataRow;
vector<string *> keys;
vector<string *> values;
void setDataRow(vector<string> r) {
dataRow = r;
}
}
一些字符串数据被标记为键,而另一些则被标记为值。我的下一个处理最好将所有字符串数据放在一个向量中,这就是我没有两个字符串向量(向量键、向量值)的原因。
然后我有这个:
vector< vector<record> > resultSet;
矢量就像数据表 - 带有字符串数据的行集。我需要这些表的具体计数,因此需要记录向量的向量。表格的数量是可选的,所以当我设置表格数量时,我通过保留功能准备表格:
resultSet.reserve(count);
for(unsigned int i = 0; i < count; i++) {
vector<record> vec;
resultSet.push_back(vec);
}
当我想向 resultSet 添加新记录时,我知道我需要插入记录的表的数量。在 resultSet[number].push_back(rec) 之后,我需要在向量“keys”和“values”中更改指针,因为 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 什么都不做。
感谢您的阅读和可能的答案。