将void指针的两个矢量(void*)合并到生成的新矢量中

merge two vector of void pointer (void *) into resulting new one

本文关键字:void 合并 新矢量 两个 指针      更新时间:2023-10-16

如果下面的合并令人困惑,下面是我试图实现的高级方法:

我有两个矢量,每个vector<void *>

say vectorA=有三个元素:void * aa, void * ab, void *ac
vectorB=有三个元素:void * ba, void * bb, void *bc

组合是向量C:三个元素:void * ca, void * cb, void *cc其中void*ca是aaba 的组合

我有以下代码将std::vector类型的两个矢量合并为一个新的矢量:这是我班(QuadTree(的一部分

void QuadTree::combineInsertData( const vector <void *> &data, size_t numDataTuples, const vector <void *> &addData, size_t numAddDataTuples, vector<void *> &resData){
    cout << "tt in combine Function" << endl;
    cout << " ttnumDataTuples: " << numDataTuples << endl;
    cout << " ttnumAddDataTuples: " << 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]);这是我之前怀疑的。

一个好的替代方案就是:

std::copy(data.begin(), data.end(), std::back_inserter(newInsertData));

一般来说,我鼓励将工作委派给STL容器。

试着理解你想要什么。所以从这个开始:

#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的复制算法。您可以通过使用迭代器使代码更加通用,而不是将其固定为仅使用向量,但我将其留给其他人改进。

此行中的错误

memcpy(resData[c] + numDataTuples , addData[c] , numAddDataTuples * colElemSizes_[c]);

应该是

memcpy(resData[c] + numDataTuples * colElemSizes_[c] , addData[c] , numAddDataTuples * colElemSizes_[c]);

由于它是空指针,所以我想它不知道拷贝从哪里开始。