C++ C++;将文件读入数组/列表/向量

C++ C++;将文件读入数组/列表/向量,c++,arrays,optimization,join,vector,C++,Arrays,Optimization,Join,Vector,我目前正在开发一个连接两个文本文件的小程序(类似于数据库连接)。一个文件可能如下所示: 269ED3 86356D 818858 5C8ABB 531810 38066C 7485C5 948FD4 7485C5 948FD4 第二个类似: hsdf87347 7485C5 rhdff 23487 948FD4 两个文件都有超过1.000.000行,并且不限于特定数

我目前正在开发一个连接两个文本文件的小程序(类似于数据库连接)。一个文件可能如下所示:


    269ED3
    86356D
    818858
    5C8ABB
    531810
    38066C
    7485C5
    948FD4

    7485C5
    948FD4
第二个类似:


    hsdf87347
    7485C5
    rhdff
    23487
    948FD4
两个文件都有超过1.000.000行,并且不限于特定数量的字符。我想做的是在两个文件中找到所有匹配的行

我尝试了一些东西,数组,向量,列表,但我目前正在努力决定什么是最好的(最快和内存简单的)方式

我的代码当前看起来像:



    #include iostream>
    #include fstream>
    #include string>
    #include ctime>
    #include list>
    #include algorithm>
    #include iterator>
    using namespace std;


    int main()
    {

        string line;

        clock_t startTime = clock();

        list data;
        //read first file
        ifstream myfile ("test.txt");
        if (myfile.is_open())
        {
            for(line; getline(myfile, line);/**/){
                data.push_back(line);
            }

            myfile.close();
        }

        list data2;
        //read second file
        ifstream myfile2 ("test2.txt");
        if (myfile2.is_open())
        {
            for(line; getline(myfile2, line);/**/){
                data2.push_back(line);
            }

            myfile2.close();
        }
        else cout  data2[k], k++
        //if data[j] > a;

        return 0;


    }

我的想法是:对于向量,对元素的随机访问非常困难,跳转到下一个元素不是最优的(不是在代码中,但我希望你明白这一点)。使用push_back并逐个添加行,将文件读入向量也需要很长时间。使用阵列时,随机访问更容易,但将>1.000.000条记录读取到阵列中会占用大量内存,并且需要很长时间。列表可以更快地读取文件,随机访问又是昂贵的

最后,我不仅要寻找精确的匹配,还要寻找每行的前4个字符

你能帮我决定一下,最有效的方法是什么吗?我尝试过数组、向量和列表,但对目前的速度并不满意。有没有其他我没有考虑过的找到匹配项的方法?我很高兴完全改变代码,期待任何建议

非常感谢

编辑:输出应列出匹配的值/行。在本例中,输出应如下所示:


    269ED3
    86356D
    818858
    5C8ABB
    531810
    38066C
    7485C5
    948FD4

    7485C5
    948FD4

一种解决方案是一次读取整个文件

使用istream::seekg和istream::tellg计算两个文件的大小。分配一个足够大的字符数组来存储它们。使用istream::Read将这两个文件读入数组中的适当位置


一种解决方案是一次读取整个文件

使用istream::seekg和istream::tellg计算两个文件的大小。分配一个足够大的字符数组来存储它们。使用istream::Read将这两个文件读入数组中的适当位置


阅读200万行不会太慢,可能会慢下来的是你的比较逻辑:

使用:

data1.sort(data1.begin(),data1.end());//N1log(N1)
data2.sort(data2.begin(),data2.end());//N2log(N2)
std::向量v//给出匹配元素
std::set_交叉点(data1.begin(),data1.end(),
data2.begin(),data2.end(),
标准:背部插入器(v);
//是否进行2(N1+N2-1)比较(最坏情况)

您还可以尝试使用
std::set
并将两个文件中的行插入其中,结果集将只有唯一的元素。

读取200万行不会太慢,可能会减慢的是比较逻辑:

使用:

data1.sort(data1.begin(),data1.end());//N1log(N1)
data2.sort(data2.begin(),data2.end());//N2log(N2)
std::向量v//给出匹配元素
std::set_交叉点(data1.begin(),data1.end(),
data2.begin(),data2.end(),
标准:背部插入器(v);
//是否进行2(N1+N2-1)比较(最坏情况)

您还可以尝试使用
std::set
并将两个文件中的行插入其中,结果集将只有唯一的元素。

如果此值在第一个文件中是唯一的,则在利用集的
O(nlogn)
特征时,这将变得微不足道。下面将第一个文件中的所有行作为命令行参数传递给一个集合,然后对第二个文件中的每一行执行
O(logn)
搜索

编辑:添加了仅4个字符的前导搜索。为此,集合只包含每行的前四个字符,从第二行开始的搜索只查找每行搜索的前四个字符。如果存在匹配项,则第二个文件行将全部打印。完整打印第一个文件行会有点困难

#include <iostream>
#include <fstream>
#include <string>
#include <set>

int main(int argc, char *argv[])
{
    if (argc < 3)
        return EXIT_FAILURE;

    // load set with first file
    std::ifstream inf(argv[1]);
    std::set<std::string> lines;
    std::string line;
    for (unsigned int i=1; std::getline(inf,line); ++i)
        lines.insert(line.substr(0,4));

    // load second file, identifying all entries.
    std::ifstream inf2(argv[2]);
    while (std::getline(inf2, line))
    {
        if (lines.find(line.substr(0,4)) != lines.end())
            std::cout << line << std::endl;
    }

    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc<3)
返回退出失败;
//使用第一个文件加载集
std::ifstream-inf(argv[1]);
std::设置行;
std::字符串行;
for(unsigned int i=1;std::getline(inf,line);+i)
行。插入(行。子行(0,4));
//加载第二个文件,标识所有条目。
std::ifstream inf2(argv[2]);
while(std::getline(inf2,line))
{
if(lines.find(line.substr(0,4))!=lines.end()

std::cout如果第一个文件中的值是唯一的,那么在利用集合的
O(nlogn)
特性时,这就变得微不足道了。下面将存储第一个文件中作为命令行参数传递给集合的所有行,然后对第二个文件中的每一行执行
O(logn)
搜索

编辑:添加了仅4个字符的前导搜索。为此,集合只包含每行的前四个字符,从第二行开始的搜索只查找每行搜索的前四个字符。如果存在匹配项,则第二个文件行将完整打印。完整打印第一个文件行将更具挑战性g

#include <iostream>
#include <fstream>
#include <string>
#include <set>

int main(int argc, char *argv[])
{
    if (argc < 3)
        return EXIT_FAILURE;

    // load set with first file
    std::ifstream inf(argv[1]);
    std::set<std::string> lines;
    std::string line;
    for (unsigned int i=1; std::getline(inf,line); ++i)
        lines.insert(line.substr(0,4));

    // load second file, identifying all entries.
    std::ifstream inf2(argv[2]);
    while (std::getline(inf2, line))
    {
        if (lines.find(line.substr(0,4)) != lines.end())
            std::cout << line << std::endl;
    }

    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc<3)
返回退出失败;
//使用第一个文件加载集
std::ifstream-inf(argv[1]);
std::设置行;
std::字符串行;
for(unsigned int i=1;std::getline(inf,line);+i)
行。插入(行。子行(0,4));
//加载第二个文件,标识所有条目。
std::ifstream inf2(argv[2]);
while(std::getline(inf2,line))
{
if(lines.find(line.substr(0,4))!=lines.end()

std::您能更具体地说明要求或约束吗?您必须报告匹配行的行号还是只输出