【发布时间】:2017-07-28 21:56:49
【问题描述】:
我有一个std::vector<unsigned char> vec 和一个大小为 (len) 的 (unsigned char) 的预分配连续缓冲区,我知道它是存储在名为 start 的 unsigned char* 变量中的开始。我知道我可以使用std::copy(start,start+len,vec.begin()) 将它们复制到向量中,但是我可以不复制就这样做吗?我可以让vec.begin() 指向开始指针吗?我已经在内存中分配了所有值,我不想将它们复制到向量中,因为我有内存限制。
指针和长度是通过外部 API 提供给我的,所以我无法更改。
【问题讨论】:
-
你能给我们一些代码吗?听起来您可能想要
span或view。 -
请注意,
std::copy(start,start+len,vec.begin())是未定义的行为,如果您尚未完成vec.resize(len)。 -
坚持使用
std::vector构造函数。像这样:std::vector<unsigned char> vec (start, start + len); -
@DimChtz 请注意,这确实会分配额外的内存
-
这可以通过以一些非常、非常粗略的方式破解自定义分配器来实现。然而,这真的很恶心。更好的解决方案是:1)只需将其吸收并复制到向量中。这样做真的是世界末日吗? 2)放弃拥有一个向量。 C++ 中传递这类东西的规范方法是通过成对的迭代器,这个例子实际上说明了原因。