C ++相当于Java的System.arraycopy

时间:2010-10-02 03:07:57

标签: java c++ arrays

我正在尝试移植一些大量使用System.arraycopy方法的Java代码,并想知道C ++中是否存在等效代码。基本上我想要有n个字节数组并将它们组合成一个大数组。每个初始数组都可以是可变长度的,所以我不想经历计算结束数组长度的箍,然后一次填充整个数组一个位置,因为这感觉相当慢,我敢肯定这个操作已经优化。但是,我无法找到这种优化的结果(虽然我可能会使它变得比它应该更复杂)。

这里有一些伪(Java)代码来说明我想要做的事情。

byte[] a = new byte[]{0x00, 0x01, 0x02};
byte[] b = new byte[][0x03, 0x04, 0x05];
byte[] ab = new byte[a.length+b.length];
System.arraycopy(ab, 0, a, 0, a.length);
System.arraycopy(ab, a.length+1, b, 0, b.length);
//Now, I would expect ab to look like {0x00, 0x01, 0x02, 0x03, 0x04, 0x05}

就像我说的,这在C ++中可能很简单,但我会做很多次,并希望确保我尽可能高效地完成它。

2 个答案:

答案 0 :(得分:5)

给定a_len和b_len(包含a和b的字节长度),以及足以容纳两个数组的dst缓冲区,可以使用memcpy。注意:这还取决于dst被声明为指向字节大小数据的指针。

memcpy( dst, a, a_len );
memcpy( dst+a_len, b, b_len );

这适用于原始类型(因为它看起来像是在复制字节数组)...如果你需要复制对象,请看一下std :: copy<>()。

答案 1 :(得分:1)

试试这个:

#include <vector>

int main()
{
    typedef unsigned char Byte;
    std::vector<Byte> a;
    std::vector<Byte> b;
    // Fill vectors a and b

    std::vector<Byte> ab;
    // Reserve enough memory to fit a and b in order to avoid
    // unnecessary reallocations.
    ab.reserve(a.size() + b.size());
    ab.insert(ab.end(), a.begin(), a.end());
    ab.insert(ab.end(), b.begin(), b.end());

    return 0;
}

在C ++中,std::vector是您友好的邻居,可动态调整大小的数组。它与随机访问的常规数组一样快。值得花时间研究标准库中的std::vector和其他容器/算法。我推荐Josuttis的C ++标准库书。

对基本类型的向量的

vector::insert可能与在C数组上进行C风格的memcpy一样快。如果不是,我会非常惊讶。