为什么我们不能改变std::vector的数据指针?
我有一个数组char* source和一个向量std::vector<char> target。我想让向量target指向sourceO(1),而不复制数据。
沿着这些路线的东西:
#include <vector>
char* source = new char[3] { 1, 2, 3 };
std::vector<char> target;
target.resize(3);
target.setData(source); // <- Doesn't exist
// OR
std::swap(target.data(), source); // <- swap() does not support char*
delete[] source;
为什么不能手动更改矢量指向的位置?如果可能的话,是否会出现一些特定的、无法管理的问题?
回答
C++vector类支持添加和删除元素,保证内存中的连续顺序。如果您可以vector使用现有的内存缓冲区初始化您的内存缓冲区,并向其中添加足够的元素,它要么会溢出,要么需要重新分配。
的接口vector假定它管理其内部缓冲区,也就是说,它可以随时分配、解除分配、调整大小(当然在规范内)。如果您需要一些不允许管理其缓冲区的内容,则不能使用vector- 使用不同的数据结构或自己编写。
您可以vector通过复制数据(使用带有两个指针或 的构造函数assign)来创建对象,但这显然不是您想要的。
或者,您可以使用string_view,它看起来几乎或可能正是您需要的。
- @Antti_M If you resize the vector, it internally allocates memory. It does not make sense then to throw this memory away and replace it with an externally provided buffer.