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

Are*_*ref 2 c++ stdvector

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

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

Chr*_*nis 7

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

如果它必须是一个向量,那么如果不进行复制,你就运气不好了。

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

gsl::span<int> s(myPtr, 4);
Run Code Online (Sandbox Code Playgroud)

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