【问题标题】:How can I populate a std::vector from a buffer and its size? [duplicate]如何从缓冲区填充 std::vector 及其大小? [复制]
【发布时间】:2013-09-02 10:02:12
【问题描述】:

我有一个关于std::vector 类型的简单问题。根本问题很简单:我有一个函数可以将数据流读入缓冲区(以及获取缓冲区的大小),然后将该数据作为向量返回。集合元素的类型是固定的,uint8_t。我的问题是,有没有比走缓冲区更好的方法来填充向量?

这是我天真、轻率的代码:

uint8_t* buffer;
size_t size;
stream->readBuffer(buffer, size); // I don't own the stream class
std::vector<uint8_t> output(size);
for (size_t i = 0; i < currentChunkLength; i++)
{
    output.push_back(buffer[i]);
}
return output;

【问题讨论】:

  • std::vector&lt;uint8_t&gt;(buffer, buffer+size); PS:如果你初始化一个有大小的向量,不要使用push back,你最终会得到两倍的元素,其中前半部分有默认值。
  • 啊,我没有看到类似的问题(我不认为我的指针和长度是 c 样式的数组)。令人惊讶的是答案都不同!不管看起来我应该把它当作一个骗子来关闭。

标签: c++ c++11 vector


【解决方案1】:

使用带有迭代器的构造函数:

std::vector<unit8_t> output(buffer, buffer + size);

【讨论】:

    【解决方案2】:

    您可以一步阅读(您拥有vector):

    std::vector<uint8_t> output(size);
    stream->readBuffer(output.data(), output.size());
    

    【讨论】:

    • 有趣。我没有考虑到这一点。只是因为我很好奇,直接读入向量的利弊是什么?我假设我至少要节省一个内存分配?
    • 如果 readBuffer 方法自己分配内存我不认为你可以这样做。
    • @fatcat1111 一个 memcpy 到什么?在您的示例中,缓冲区 ptr 是未初始化的
    • std::vector 是连续的并且没有内存泄漏。这是简单类型的堆内存使用的 C++ 方式。 (我已经很多年没有直接打电话给deletedelete []了。)
    • @fatcat1111 我的观点完全正确,在您的示例中没有指向任何内容,因此将内存复制到其中是不好的。
    猜你喜欢
    • 2019-09-29
    • 2013-02-21
    • 2017-01-05
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多