gpt4 book ai didi

c++ - 多流迭代器 C++

转载 作者:IT老高 更新时间:2023-10-28 22:39:06 25 4
gpt4 key购买 nike

我的程序的目的是打开一个m行等长n行的文本文件,逐列读取文件并打印每一列。

例如,对于这个文本文件

abcd
efgh
jklm

我想打印

a e j
b f k
c g l
d h m

由于一行长度可以是200 000 000,而列长度可以超过10 000,所以我无法以矩阵的形式打开内存中的所有文件。

理论上,我希望有一个程序在空间上使用 O(m),在时间上使用 O(m*n)。

一开始,我不得不考虑这些解决方案:

  • 如果我看到每一列的所有文件,复杂度为 O(m*n²),
  • 如果我使用 seekg 和一个位置数组并从一个位置跳到另一个位置,复杂度是 O(mnlog(n))。

最后一点,对于一些服务器问题,我只需要使用 STL。

我的最后一个想法是创建一个文件的迭代器数组,并在每行的开头初始化这些迭代器。之后,要查看下一列,我只需要增加每个迭代器。这是我的代码

ifstream str2;
str2.open ("Input/test.data", ifstream::in);

int nbline = 3;
int nbcolumn = 4;
int x = 0;

istreambuf_iterator<char> istart (str2);
istreambuf_iterator<char> iend ;

istreambuf_iterator<char>* iarray;
iarray = new istreambuf_iterator<char>[nbline];


while (istart != iend){
if (x % nbcolumn == 0){
iarray[x/nbcolumn] = istart;
}
istart++;
x++;
}

for (int j = 0; j<nbcolumn;j++){
for (int i = 0; i<nbline;i++){
cout << *iarray[i] << "\t";
iarray[i]++;
}
cout << endl;
}

很遗憾,它不起作用,我有这个东西作为输出

a       e       f       
� � �
� � �
� � �

我认为问题在于迭代器数组iarray并不独立于istart,我该怎么做呢?

最佳答案

您可以将任务分成 block ,然后处理每个 block ,然后再继续下一个。

您需要为每一行设置一个缓冲区(缓冲区越大,性能越好)以及该行的查找位置。您可能还需要对文件进行初始传递,以获得每行的正确偏移量。

将 B 字节读入每行的缓冲区(使用 tellg 保存每行中的位置),然后循环遍历这些字节并生成输出。返回并从每一行读取接下来的 B 个字节(使用 seekg 预先设置文件位置,然后使用 tellg 记住它)并生成输出。重复直到完成,注意最后一 block (或少量输入)不要超过行尾。

使用您的示例,您需要跟踪 3 行。使用大小为 2 的 B,您可以将 abefjk 读入 3 个缓冲区。循环遍历你输出的 aejbfk。返回并阅读下一个 block :cdghlm。这给出了 cgldhm 作为输出。

关于c++ - 多流迭代器 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52926935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com