【问题标题】:fastest way to convert a file to list c++将文件转换为列表 C++ 的最快方法
【发布时间】:2014-04-26 19:34:20
【问题描述】:

我有一个充满整数的文件,已排序,我需要将文件的内容放到一个列表中。 文件看起来像这样:

     1
     4
     45
     150
     245
     365

我知道可以逐行读取并 push_back,但文件数超过 500 000 行,所以他们是一种快速的方法吗?

目标是查看文件中是否有整数,所以我需要转换为列表,然后进行 binary_search,如果您有更好的想法,我将不胜感激。

【问题讨论】:

  • 取决于它是一次性搜索还是您想要多次执行的操作。
  • 查看std::map 容器以利用其log n 搜索性能。然后想想如何使用每个整数作为键。该值可以是该键在文件中出现的次数。
  • 文件中的整数是否已经排序?
  • 因此,您实际上并不想要 std::list,而是 std::vector,最好是 std::unordered_list。
  • 文件已排序;如示例所示

标签: c++ algorithm list binary-search


【解决方案1】:

要读入列表,您可以使用std::istreambuf_iterator:

std::ifstream t( "file.txt");
std::list<int> l( ( std::istreambuf_iterator<int>( t)),
                     std::istreambuf_iterator<int>());

【讨论】:

    【解决方案2】:

    如果您想多次搜索,我建议将文件内容放入哈希表中。这为您提供了最佳的 O(1) 查找。

    【讨论】:

    • 我喜欢这个想法胜过我对std::map的建议
    • 嗨,我只是想看看 Int 是否存在,例如文件中是否存在 45
    • 候选人以前知道吗?它们是硬编码的吗?在这两种情况下,阅读它们并立即测试它们。否则,std::unordered_map 将保留正确的容器。
    • @Reda,如果您只想在不需要列表或任何其他数据结构时这样做。只需对文件进行操作。这是最快的。可以这样想:如果您执行一次,然后处理所有文件以将内容放入您已经看到的任何数据结构中,如果您想要查找的数字就在那里,因此不需要数据结构。
    • @Reda:是的,如果你搜索一次,就逐行搜索。
    【解决方案3】:

    我会这样做:

    #include <iostream>
    #include <iterator>
    #include <unordered_set>
    
    int main() {
      std::ifstream t { "file.txt", ios::ate };
      std::unordered_set s;
      s.reserve(t.tellg());
      t.seekg(0);
      s.insert(std::istream_iterator<int>(t), std::istream_iterator<int>());
    // now you can use s.find(key) to see if something is in the set
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 1970-01-01
      • 2011-04-16
      • 2010-10-01
      • 2019-06-23
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多