如何使std :: vector <t>使用现有的T *数组而不复制这些值?

时间:2017-07-28 21:56:50

标签: c++ stdvector

我有一个std::vector<unsigned char> vec和一个预先分配的(unsigned char)缓冲区,其大小(len),我知道它的开头存储在一个名为{{1}的unsigned char*变量中}}。我知道我可以使用start将它们复制到矢量中,但我可以不复制吗?我可以让std::copy(start,start+len,vec.begin())指向开始指针吗?我已经在内存中分配了所有值,并且我不想将它们复制到向量中,因为我有内存约束。

指针和长度是通过外部API提供给我的,所以我无法改变它。

2 个答案:

答案 0 :(得分:4)

向量中没有接口可以使其占用预先存在的缓冲区。即使您可以使用提供此内存地址的自定义分配器将其转换为向量,该向量也会将其视为原始内存并覆盖它。

如果它必须是一个向量,那么你就没有复制而没有运气。

但是,对现有缓冲区的某种自适应视图可以在不复制的情况下为数组提供类似容器的接口(例如Justin的评论中建议的gsl :: span)。

gsl::span<int> s(myPtr, 4);

https://github.com/Microsoft/GSLhttp://codexpert.ro/blog/2016/03/07/guidelines-support-library-review-spant/

答案 1 :(得分:0)

由于你想控制向量的内存分配,你需要创建自己的allocator类来做到这一点,并将其作为模板参数传递,如下所示:

std::vector<int, my_custom_allocator<int>> my_vector;

这是一个关于如何创建自己的分配器的好教程:The Standard Librarian: What Are Allocators Good For?