假设我有一个函数将数据导入std向量:
void getData(std::vector<int> &toBeFilled) {
// Push data into "toBeFilled"
}
Run Code Online (Sandbox Code Playgroud)
现在我想将这些数据发送到另一个函数,该函数应在完成时释放数据:
void useData(int* data)
{
// Do something with the data...
delete[] data;
}
Run Code Online (Sandbox Code Playgroud)
这两个函数(getData和useData)都是固定的,无法更改.复制数据一次时这很好用:
{
std::vector<int> data;
getData(data);
int *heapData = new int[data.size()];
memcpy(heapData, data.data(), data.size()*sizeof(int));
useData(heapData);
data.clear();
}
Run Code Online (Sandbox Code Playgroud)
但是,这个memcpy操作很昂贵而且并不是真正需要的,因为数据已经在堆上了.是否可以直接提取和使用std向量分配的数据?像(伪代码)的东西:
{
std::vector<int> data;
getData(data);
useData(data.data());
data.clearNoDelete();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这个例子可能没有多大意义,因为在函数调用useData之后可以释放向量.但是,在实际代码中,useData不是一个函数,而是一个接收数据的类,这个类的寿命比向量长...
我发现自己处于这样一种情况,我希望有一个类似于unique_ptrs release()for的情况std::vector<>。例如:
std::vector<int> v(SOME_SIZE);
//.. performing operations on v
int* data = v.release(); // v.size() is now 0 and the ownership of the internal array is released
functionUsingAndInternallyDeletingRowPointer(data);
Run Code Online (Sandbox Code Playgroud)
有什么特殊原因不提供这种可能性吗?std::vector这会对内部实施施加一些限制吗?
或者有一种方法可以实现这一点,而我却尴尬地错过了?