c++ - 流式传输到 vector ?

标签 c++ performance

偶然发现这段代码将文件的内容插入到 vector 中。学习如何做似乎是一件有用的事情:

#include <iostream>
#include <fstream>
#include <vector>

int main() {
   typedef std::vector<char> fileContainer;
   std::ifstream testFile("testfile.txt");
   fileContainer container;
   container.assign(
      (std::istreambuf_iterator<char>(testFile)),
      std::istreambuf_iterator<char>());
    return 0;
}

它有效,但我想问一下这是做这种事情的最佳方法吗?也就是说,获取任何文件类型的内容并将其插入适当的 STL 容器中。有比上面更有效的方法吗?据我所知,它创建了一个 ifstream 的 testFile 实例,并用 testfile.txt 的内容填充它,然后该拷贝通过分配再次复制到容器中。好像抄袭很多?

至于速度/效率,我不确定如何估计文件大小并使用保留功能,如果我使用保留功能,它似乎甚至会减慢这段代码的速度。目前,换出 vector 并仅使用双端队列似乎效率更高。

最佳答案

我不确定是否有最佳方法,但是使用两个迭代器 构造函数会更惯用:

FileContainer container( (std::istreambuf_iterator<char>( testFile )),
                         (std::istreambuf_iterator<char>()) );

(我注意到您的 assign 中有额外的括号。他们 那里不是必需的,但是当您使用构造函数时它们是必需的。)

关于性能,预分配会更有效 数据,例如:

FileContainer container( actualSizeOfFile );
std::copy( std::istreambuf_iterator<char>( testFile ),
           std::istreambuf_iterator<char>(),
           container.begin() );

这有点危险;如果你的估计太小,你会 遇到未定义的行为。为避免这种情况,您还可以这样做:

FileContainer container;
container.reserve( estimatedSizeOfFile );
container.insert( container.begin(),
                  std::istreambuf_iterator<char>( testFile ),
                  std::istreambuf_iterator<char>() );

这两者中哪一个更快取决于实现;最后 我测量的时间(用 g++),第一个稍微快一点,但如果你 实际上从文件中读取,差异可能无法测量。

这两种方法的问题在于,尽管有其他答案, 除了实际查找文件大小之外,没有可移植的方法 读取文件。某些系统存在不可移植的方法(fstat 在 Unix 下),但在其他系统上,如 Windows,没有意味着 找到您可以从文本文件中读取的 char 的确切数量。 当然,不能保证 tellg() 的结果会 甚至转换为整数类型,如果是这样,他们就不会 成为一个神奇的 cookies ,没有数字意义。

话虽如此,在实践中,其他人建议使用 tellg() 海报通常“足够便携”(Windows 和大多数 Unix,位于 最少),结果往往“足够接近”;他们通常会 在 Windows 下有点太高了(因为结果会计算 不会被读取的回车符),但在很多情况下, 这不是什么大问题。最后,由你决定什么 您的要求与便携性和精确性有关 大小。

关于c++ - 流式传输到 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796857/

相关文章:

c++ - 有没有办法让 C++ Switch 语句循环回到第一种情况?

c++ - 在 boost 的 multi_index_container 中获取不等于 x 的值

java - 无法通过 Codility GenomicRangeQuery 测试的性能

mysql InnoDB : FOREIGN KEY constraint performance

c++ - 在 C++ 中处理内存大小是否不好?

php - 一个写入excel的表格

c++ - 对 clockType::clockType(int, int, int) 的 undefined reference

c++ - 关于头文件C++中的类声明

performance - 比较 QString 和 char* 的最有效方法是什么

performance - 加快 Node 模块的许多安装速度