使用 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/