c++ - 将多个txt文件合并为一个

标签 c++ file boost merge

下午好。

我遇到了一些问题。我可以解决它,但我没有编程经验,我觉得这个问题有更漂亮和合理的解决方案。

问题如下。给定一组总大小超过一百兆字节的文本文件。从 2 到 N 的文件数。文件包含排序的唯一数字(例如,ID)。 它想将所有数字合并到一个输出文件中。在生成的文件编号中也需要进行排序。

我将按如下方式解决这个问题: 打开所有文件。取出每个文件的第一个数字。将它们放在一个容器中(例如,载体)。找到容器内的最小数字。将最小数字放入输出文件中。在他的位置,从文件中输入以下数字,从中取出最小数字。 好像这个方法叫做“外部归并排序”。

请告诉我,有没有更聪明的方法来解决这个问题?

最佳答案

外部归并排序就是为解决这个问题而创建的。这种排序的复杂度是 N * log(number_of_files)

为了简化您的代码,您可以将文件流与优先级队列中的数字一起存储。

完全未经测试,但可能有用的代码:

std::vector<ifstream> file_streams(stream_count);  
// open streams.
using int_and_stream = std::pair<int, std::ifstream&>;
using cont = std::vector<int_and_stream>;
std::priority_queue<int_and_stream, cont, pair_comparer> queue;

for(auto& stream: file_streams){
   int id;
   stream >> id;
   queue.push(std::make_pair(id, stream));
}

while(!queue.empty()){
   auto smallest = queue.top();
   outstream << smallest.first;
   int id;
   if(smallest.second >> id){ // file ended?
      queue.push(std::make_pair(id, stream));
   }
}              

对于 pair_comparer,您可以查看 here

关于c++ - 将多个txt文件合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31321084/

相关文章:

c++ - return 语句中的 boost::scoped_array::get()

c++ - 为什么前向迭代器没有加法赋值运算符?

java - 从java中的不同类写入同一个文件

c++ - 隐藏结构细节的迭代器适配器

c++ - 使用 boost 库收听 udp 广播

c++ - '系统' : a namespace with this name does not exist

c++ - 窗口 HTTP IO 完成端口

java - 将文件传递给另一个方法时出现矛盾的异常

c - 将文本文件的每一行存储到数组中

c++ - Android NDK cmake 和依赖库