私は現在、2 つのテキスト ファイルを結合する小さなプログラムに取り組んでいます (データベース結合に似ています)。1 つのファイルは次のようになります。
269ED3
86356D
818858
5C8ABB
531810
38066C
7485C5
948FD4
2番目のものは似ています:
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 行ずつ追加してファイルをベクトルに読み込むには、長い時間がかかります。配列を使用すると、ランダム アクセスが簡単になりますが、1.000.000 を超えるレコードを配列に読み込むと、メモリが大量に消費され、時間もかかります。リストはファイルをより速く読み取ることができますが、ランダムアクセスは再び高価です.
最終的には、完全一致だけでなく、各行の最初の 4 文字も検索します。
最も効率的な方法は何かを判断するのを手伝ってもらえますか? 配列、ベクトル、リストを試しましたが、今のところ速度に満足していません。私が考慮していない、一致を見つける他の方法はありますか? コードを完全に変更できることを非常にうれしく思います。提案を楽しみにしています!
どうもありがとう!
編集: 出力には、一致する値/行が一覧表示されます。この例では、出力は次のようになります。
7485C5
948FD4