筛选器重复列表-列出重复数据删除
Filter Lists for Repeats - List Deduplication
我有一些单词列表分布在几个文件中,我需要一种快速的方法将它们合并到一个文件中。我希望在合并时删除重复项,这样最终列表就不会包含单个单词的多个实例。
示例:
文本文件list_a.txt
显示以下内容:
apple
pear
peach
文本文件list_b.txt
显示以下内容:
foo
bar
peach
car
合并时,输出文件应显示:
apple
pear
peach
foo
bar
car
注意,list_a.txt
和list_b.txt
都包含单词peach,但它只在输出文件中出现过一次。
这是我使用的代码:
int main()
{
string myList = "";
string myFiles[] = {"list_a.txt", "list_b.txt"};
string line;
int iterationsSinceSleep = 0;
size_t length = sizeof(myFiles)/sizeof(myFiles[0]);
for(unsigned int i = 0; i < length; i++){
cout<<"Starting " << myFiles[i] << endl;
ifstream myfile((string("C:/words/").append(myFiles[i])).c_str());
if (myfile.is_open())
{
while ( getline (myfile,line) ){
string trimmedLine = trim(line);
if(myList.find(trimmedLine) == string::npos){
myList.append(trimmedLine + 'n');
}
iterationsSinceSleep++;
iterationsSinceSleep %= 10000;
// Save the CPU!
if(iterationsSinceSleep == 0) Sleep(10);
}
myfile.close();
}else{
cout << "Could not open & process " << myFiles[i] << endl;
}
Sleep(75); // Save the CPU!
iterationsSinceSleep = 0;
}
// write to the file
ofstream myfile ("C:/words/merged/final.txt");
if (myfile.is_open())
{
cout<<"Writing filtered list"<<endl;
myfile << myList;
myfile.flush();
myfile.close();
}else{
cout<<"Could not save filtered list."<<endl;
}
return 0;
}
这适用于较小的列表/文件,但我的一个列表有几百万行。
我需要一种方法来使这段代码运行良好,即使它必须处理数百万行的几个文件。
我改进这一点的第一个想法是使用数组或向量,而不是字符串来存储唯一的行。然而,这两种方法都有优点和缺点。
使用阵列的优点:
- 更快的比较检查(我认为)
- 更快的元素访问
使用阵列的缺点:
- 重新定位以插入新字符串可能很慢
- 程序必须跟踪数组的长度(这不是一个大问题,而是一个因素)
使用矢量的优点:
- 动态添加元素
- 内置搜索功能
使用矢量的缺点:
- 在向量中插入元素很慢(所以我已经读过了)
- 我想矢量会有更多的开销
有人能为改进这段代码并提高编写效率提供建议吗?速度是一个主要问题,但我也需要考虑内存消耗。
提前谢谢。
使用std::set
。集合不允许重复条目。试试类似的东西:
std::set<std::string> mySet;
...
mySet.insert(trimmedString);
...
for (auto &&str : mySet)
myFile << str;
注意:我刚刚在这里打了这个,所以可能有一些打字错误。
另请注意:这将对输出进行排序,不确定是否需要。
相关文章:
- 从 Typedef 数据类型中删除常量
- 从输入中删除重复项,而不使用任何数据结构
- 删除使数据处于"错误状态"的默认构造函数的模式?
- 从自定义数据类型向量中删除重复元素
- 如何使用C++删除/更新txt文件中的特定数据
- 如何使用C++删除/更新txt文件中的特定数据?
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- C++ - 按自定义数据类型向量的值删除元素
- 如何从 txt 文件中删除数据/内容
- 如何通过其持有的数据从链表中删除某个节点?
- 基于给定字符串数据类型的链表删除节点
- 如何在 C++ 中使用删除运算符删除单个数据
- 如何在每次循环迭代期间生成向量,存储数据,然后删除该向量?
- 如何从C ++的输出中删除垃圾数据(垃圾数据)
- 如何从 HTTP 响应中删除垃圾数据
- C++ 类析构函数删除部分但不是全部成员数据
- 在向量上调用 clear() 实际上不会删除 data() 中的数据?
- SOCAT,将TCP套接字转发到Unix套接字,将recvmsg()更改为read(),删除辅助数据
- 如何删除字符串中的所有空格并将数据存储在两者之间
- 筛选器重复列表-列出重复数据删除