c++ - 这种方法会涉及内存重新分配从而影响其效率吗?

标签 c++ file vector ifstream

我发现我们可以将文件的内容读入 std::vector 中,如下所示:

  ifstream fin(..., ios::in);
    std::vector<char> buf(
            std::istreambuf_iterator<char>(fin), 
            std::istreambuf_iterator<char>());   

此方法是否会导致大量内存重新分配,就像我多次调用 buf.push_back(); 一样?将文件读入 std::vector 的最快或最佳方法是什么?

编辑: 顺便说一句,我发现有一种方法可以将文件读入字符串流:

stringstream ss;
ifstream fin(..., ios::in);
fin >> ss.rdbuf();

这种方法会出现同样的内存重新分配问题吗?

最佳答案

std::istreambuf_iterator是一个输入迭代器,因此提前不知道 begin 和 end 之间的距离。构造函数期间将会有多次重新分配,除非文件非常小。对于随机访问迭代器,距离是已知的,在这种情况下,构造函数可以避免额外的内存分配。

如果你大致知道文件的大小,可以使用 reserve()阅读之前:

std::vector<char> buf;
buf.reserve(file_size);
buf.insert(buf.end(), std::istreambuf_iterator<char>(fin), 
        std::istreambuf_iterator<char>());   

关于c++ - 这种方法会涉及内存重新分配从而影响其效率吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60485133/

相关文章:

c++ - header 应包含一次

c++ - 编译容易但有运行时错误

c++ - Eclipse-CDT:添加自定义构建步骤的最佳方式是什么?

c# - 查找并替换文件中的数据(不加载整个文件)?

c++ - 手动读取 Mysql 数据库文件

c++ - 由于速度原因使用std vector作为map,靠谱吗?

c++ - 验证值的函数在调用 1 个数字时返回 true,但当调用 2 个或更多数字时即使它为 true 也返回 false

mysql - 将 html 页面存储在 Mysql 数据库或文件中

c++ - C++11 是否强制要求 vector<int> 将 resize() 中的元素归零?

java - Vector 的填充时间比 ArrayList 少