C++ 使用 reserve 和可能的 emplace_back 从文件中存储 vector<std::string>

标签 c++ file-io stdvector

我正在寻找一种将文件中的字符串存储到字符串 vector 中的快速方法,这样我就可以提前保留行数。做这个的最好方式是什么?我应该先继续新行字符,还是只获取文件的总大小,然后只保留说大小/80,以便粗略估计要保留的内容。理想情况下,我不希望每次都必须重新分配 vector ,这会大大降低大文件的速度。理想情况下,我会提前计算项目的数量,但我应该通过以二进制模式打开计算新行然后重新打开来做到这一点吗?这似乎很浪费,对此有些想法感到好奇。还有一种方法可以使用 emplace_back 摆脱下面 getline 代码中的临时字符串。我确实看到了以下 2 个用于提前计算行数的实现 Fastest way to find the number of lines in a text (C++)

std::vector<std::string> vs;
std::string somestring;
std::ifstream somefile("somefilename");
while (std::getline(somefile, somestring))
vs.push_back(somestring);

我还可以做一些事情来提前获得总大小,我可以直接将这种情况下的 char* 转换为 vector 吗?这可以追溯到我的 reserve 提示,即说 size/80 或某个常量以预先为 reserve 提供估计大小。

        #include <iostream>   
        #include <fstream>     

        int main () {
          char* contents;
          std::ifstream istr ("test.txt");

          if (istr) 
          {
            std::streambuf * pbuf = istr.rdbuf();

            //which I can use as a reserve hint say size / 80  
            std::streamsize size = pbuf->pubseekoff(0,istr.end);  

            //maybe I can construct the vector from the char buf directly?
            pbuf->pubseekoff(0,istr.beg);       
            contents = new char [size];
            pbuf->sgetn (contents,size);
          }
          return 0;
    }

最佳答案

与其浪费时间提前计算行数,我只需要 reserve() 一个初始值,然后开始压入实际的行,如果你碰巧压入了保留的项目数只需 reserve() 一些空间,然后继续进行更多推送,根据需要重复。

关于C++ 使用 reserve 和可能的 emplace_back 从文件中存储 vector<std::string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17870998/

相关文章:

c++ - 计算字符串 C++ 中每个字母的频率的最有效方法是什么?

java - 更快的读取文件的方法

Java 文件 I/O 字符串全部粘在一起,没有新行

c++ - 按包含成员 vector 的值返回对象是个坏主意吗?

c++ - 重载运算符+以添加存储在 vector 中的类对象

c++ - 双矩阵的 OpenCV 中值滤波器

java - 如何从文件中获取信息(字母和整数),并存储该信息以供进一步使用?

c++ - 我可以在 C++ 中使用 ** vector < pair <int ,vector < int >>> vec** 之类的声明吗?

c++ - C++ 中随机生成的 vector 不会改变值

c++ - 为什么我不能将一个非 const 指针传递给一个以指向 const 的指针作为参数的函数