gpt4 book ai didi

c++ - 在不初始化数据的情况下调整 C++ std::vector 的大小

转载 作者:IT老高 更新时间:2023-10-28 12:41:37 30 4
gpt4 key购买 nike

使用 vector ,可以假设元素连续存储在内存中,从而允许将范围 [&vec[0], &vec[vec.capacity()) 用作普通数组。例如,

vector<char> buf;
buf.reserve(N);
int M = read(fd, &buf[0], N);

但现在 vector 不知道它包含 M 个字节的数据,由 read() 外部添加。我知道 vector::resize() 设置了大小,但是它也清除了数据,所以在 read() 之后不能用来更新大小打电话。

有没有一种简单的方法可以将数据直接读入 vector 并在之后更新大小?是的,我知道一些明显的解决方法,例如使用小数组作为临时读取缓冲区,并使用 vector::insert() 将其附加到 vector 的末尾:

char tmp[N];
int M = read(fd, tmp, N);
buf.insert(buf.end(), tmp, tmp + M)

这行得通(这就是我今天正在做的事情),但让我感到困扰的是,如果我可以将数据直接放入 vector 。

那么,当外部添加数据时,有没有一种简单的方法可以修改 vector 大小?

最佳答案

vector<char> buf;
buf.reserve(N);
int M = read(fd, &buf[0], N);

此代码片段调用未定义的行为。你不能写超出 size() 元素,即使你已经保留了空间

正确的代码是这样的:

vector<char> buf;
buf.resize(N);
int M = read(fd, &buf[0], N);
buf.resize(M);


PS. 您的声明“使用 vector ,可以假设元素连续存储在内存中,允许范围 [&vec[0], &vec[vec.capacity()) 用作普通数组”是不正确的。允许的范围是 [&vec[0], &vec[vec.size())

关于c++ - 在不初始化数据的情况下调整 C++ std::vector<char> 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7689406/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com