如果下面的合并令人困惑,这就是我试图实现的高级方法:
我有两个向量vector<void *>
说vectorA =有三个元素:void * aa, void * ab, void *ac
和vectorB =有三个元素:void * ba, void * bb, void *bc
组合是vectorC:三个元素:void * ca, void * cb, void *cc
其中void * ca是aa
和ba
我有以下代码将两个std :: vector类型的向量合并为一个新的向量: 这是我班级的一部分(QuadTree)
void QuadTree::combineInsertData( const vector <void *> &data, size_t numDataTuples, const vector <void *> &addData, size_t numAddDataTuples, vector<void *> &resData){
cout << "\t\t in combine Function" << endl;
cout << " \t\tnumDataTuples: " << numDataTuples << endl;
cout << " \t\tnumAddDataTuples: " << numAddDataTuples << endl;
for (int c = 0; c != numCols_; c++) {
resData[c] = malloc( (numDataTuples + numAddDataTuples) * colElemSizes_[c]);
memcpy(resData[c] , data[c] , numDataTuples * colElemSizes_[c]);
memcpy(resData[c] + numDataTuples , addData[c] , numAddDataTuples * colElemSizes_[c]);
}
}
它似乎没有做它应该做的事情,我不知道为什么。 以下是我如何使用它:(简单的手动测试)
vector<void *> newInsertData;
newInsertData.resize(numCols_, 0); //numCols_ = 3 in my test case
combineInsertData(insertData, numTuples, allSubdivData, subDivTupNum, newInsertData);
cout << "TEST TEST " << endl;
cout << " insertData[0][400]" << *((double *)insertData[0] + 400) << endl;
cout << " newInsertData[0][400]" << *((double *)newInsertData[0] + 400) << endl;
cout << " insertData[0][5]" << *((double *)insertData[0] + 5) << endl;
cout << " newInsertData[0][5]" << *((double *)newInsertData[0] + 5) << endl;
cout << " insertData[0][499]" << *((double *)insertData[0] + 499) << endl;
cout << " newInsertData[0][499]" << *((double *)newInsertData[0] + 499) << endl;
cout << " allSubdivData[0][0]" << *((double *)allSubdivData[0] ) << endl;
cout << " newInsertData[0][500]" << *((double *)newInsertData[0] + 500) << endl;
cout << " allSubdivData[0][1]" << *((double *)allSubdivData[0] + 1) << endl;
cout << " newInsertData[0][501]" << *((double *)newInsertData[0] + 501) << endl;
注意: 我是C / C ++的新手,感谢任何帮助。 在测试代码中,似乎只有第一个memcpy工作而第二个不工作(来自组合功能)。
??题 ??
是因为它是无效*所以这条线
resData[c] + numDataTuples
没有意义?关于偏移应该在哪里?
以下是打印出来的内容
TEST TEST | CHUNK: writing -5.69494e+06
insertData[0][400]-7.97392e+06 | CHUNK: writing -3.51803e+06
newInsertData[0][400]-7.97392e+06 | tup index = 116
insertData[0][5]-6.83384e+06 | CHUNK: writing -5.43468e+06
newInsertData[0][5]-6.83384e+06 | CHUNK: writing -3.03083e+06
insertData[0][499]-7.83881e+06 | tup index = 131
newInsertData[0][499]-7.83881e+06 | CHUNK: writing -6.50737e+06
allSubdivData[0][0]-6.86119e+06 | CHUNK: writing -4.1256e+06
newInsertData[0][500]649399 | tup index = 132
allSubdivData[0][1]-8.94236e+06 | CHUNK: writing -6.67862e+06
newInsertData[0][501]0
固定 错误就在这一行:
memcpy(resData[c] + numDataTuples , addData[c] , numAddDataTuples * colElemSizes_[c]);
应该是
memcpy(resData[c] + numDataTuples * colElemSizes_[c] , addData[c] , numAddDataTuples * colElemSizes_[c]);
这是我之前所怀疑的。
答案 0 :(得分:1)
一个很好的选择就是:
std::copy(data.begin(), data.end(), std::back_inserter(newInsertData));
总的来说,我鼓励将工作委托给STL容器。
答案 1 :(得分:0)
试图了解你想要的东西。所以从这开始:
#include <vector>
#include <algorithm>
#include <iterator>
template <typename T>
std::vector<T> Combine(const std::vector<T>& v1, const std::vector<T>& v2)
{
std::vector<T> result;
std::copy(v1.begin(), v1.end(), std::back_inserter(result));
std::copy(v2.begin(), v2.end(), std::back_inserter(result));
return result;
}
int main()
{
std::vector<void*> v1;
std::vector<void*> v2;
// assume that v1 and v2 have data
//...
std::vector<void*> r = Combine(v1, v2);
// Now r has v1 and v2 combined as one vector.
}
不可否认不是最好的,但如果这是你想要实现的,请注意使用back_inserter复制算法的用法。您可以通过使用迭代器使代码更通用,而不是将其固定为仅使用向量,但我将其留给其他人进行改进。
答案 2 :(得分:0)
此行中的错误
memcpy(resData[c] + numDataTuples , addData[c] , numAddDataTuples * colElemSizes_[c]);
应该是
memcpy(resData[c] + numDataTuples * colElemSizes_[c] , addData[c] , numAddDataTuples * colElemSizes_[c]);
因为它是无效指针,所以我不知道复制开始的地方。