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

How to make a std::vector<T> use an existing T* array without copying those values?

我有一个 std::vector<unsigned char> vec 和一个预分配的大小为 (len) 的 (unsigned char) 连续缓冲区,我知道它的开头存储在一个名为 unsigned char* 的变量中=14=]。我知道我可以使用 std::copy(start,start+len,vec.begin()) 将它们复制到向量中,但我可以不复制就这样做吗?我可以让 vec.begin() 指向起始指针吗?我已经在内存中分配了所有值,我不想将它们复制到向量中,因为我有内存限制。

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

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

如果它必须是一个向量,那么你不复制就倒霉了。

但是,现有缓冲区的某种自适应视图可以在您的阵列上提供类似容器的界面而无需复制(例如 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/

由于您想控制 vector 的内存分配,因此您需要创建自己的分配器 class,并将其作为模板参数传递,如下所示:

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

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