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

标签 c++ stl vector resize

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

相关文章:

c++ - 使用 C++ 以最快的方式在超大文本文件 (10 GB) 中搜索多个单词

c++ - 性能:对具有 N/m 个元素的 'm' 个 vector 进行排序并对具有 N 个元素的单个 vector 进行排序

c++ - 将 double 字符串转换为 double vector 的最佳方法是什么?

Multimap 上的 C++ 泛型编程

c++ - 迭代器如何在以下程序中工作

c++ - 我该如何修复错误 : conversion from ‘void’ to non-scalar type ‘std::vector<int>’ requested

c++ - 为什么这个函数不输出小数

c++ - 在 C++ 中合并样板 vector<> 代码

c++ - Vector 在退出写入它的函数后丢失数据

r - 在 R 中,将向量随机分成 k 个 block ?