将两个void指针(void *)向量合并为一个新的向量

时间:2014-03-19 19:40:31

标签: c++ merge memcpy

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

我有两个向量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是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 << "\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]);这是我之前所怀疑的。

3 个答案:

答案 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]);

因为它是无效指针,所以我不知道复制开始的地方。