将大阵列的一部分复制到较小的阵列的最佳方法是什么?

Nic*_*ner 4 c++ arrays

我有一种情况,我需要在运行时确定一定量的内存传递给一个函数.我在堆栈上使用更大的缓冲区,然后只在堆上创建必要的空间:

Foo largeBuf[1024];

int sizeUsed = fillBuff(largeBuf, 1024);

Foo* smallerBuf = new Foo[sizeUsed];

for (UINT i = 0; i < sizeUsed; i++)
{
 smallerBuf[i] = largeBuf[i];
} 
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?一些标准的阵列复制功能?

Jer*_*fin 6

您可能应该使用an std::vector,您可以直接从较大缓冲区的元素初始化:

std::vector<Foo> smallerBuf(largeBuf, largeBuf+sizeUsed);
Run Code Online (Sandbox Code Playgroud)


GMa*_*ckG 5

首先,你应该使用std::vector.没有理由不使用它.然后使用std::copy:

// surely the pointer was an accident
Foo largeBuf[1024];

// int? design should be changed to use an unsigned type
int sizeUsed = fillBuff(largeBuf, 1024); 

// vector, no memory leaks
std::vector<Foo> smallerBuf;
smallerBuf.reserve(sizeUsed);

// copy
std::copy(largeBuf, largeBuf + sizeUsed, std::back_inserter(smallerBuf));
Run Code Online (Sandbox Code Playgroud)

或者只是切入最后的追逐:

std::vector<Foo> smallerBuf(largeBuf, largeBuf + sizeUsed);
Run Code Online (Sandbox Code Playgroud)

或另一种方法:

std::vector<Foo> buf(1024); // this replaces your stack array
buf.resize(fillBuff(&buf[0], 1024)); // copies directly into it, resizes
Run Code Online (Sandbox Code Playgroud)

注意在最后一种方法之后,内存仍将被使用.您可以使用copy-swap技巧强制缩小容量:

template <typename T, typename A>
void shrink_to_fit(std::vector<T, A>& pVector)
{
    std::vector<T, A>(pVector).swap(pVector);
}

// ...

shrink_to_fit(buf);
Run Code Online (Sandbox Code Playgroud)

最理想的是,fillBuf有一种方法(或另一种函数)只返回给定缓冲区时它将返回的元素数.然后你可以这样做:

std::vector<Foo> buf(buffSize()); // or whatever
fillBuff(&buf[0], buf.size());
Run Code Online (Sandbox Code Playgroud)