我使用此功能删除文件中的重复单词 但是我需要它来删除重复的表达式
例如,该函数当前正在做什么 如果我有表达 “你好,世界” “美丽的世界” 该函数将从两个表达式中删除单词“ world”
并且仅当在文件中多次发现整个表达式时,我才需要此函数来替换整个表达式 例如
如果我有表达式 “你好,世界” “你好,世界” “美丽的世界” “美丽的世界”
该函数将删除表达式“ Hello world”和“ beautiful world”,并且仅保留其中一个,但不会触及“ world”一词,因为该函数会将引号内的所有内容都视为一个词
这是我现在使用的代码
#include <string>
#include <sstream>
#include <iostream>
#include <unordered_set>
void Remove_Duplicate_Words(string str)
{
ofstream Write_to_file{ "test.txt" };
// Used to split string around spaces.
istringstream ss(str);
// To store individual visited words
unordered_set<string> hsh;
// Traverse through all words
do
{
string word;
ss >> word;
// If current word is not seen before.
while (hsh.find(word) == hsh.end()) {
cout << word << '\n';
Write_to_file << word << endl; // write to outfile
hsh.insert(word);
}
} while (ss);
}
int main()
{
ifstream Read_from_file{ "test.txt" };
string file_content{ ist {Read_from_file}, ist{} };
Remove_Duplicate_Words(file_content);
return 0;
}
如何删除重复的表达式而不是重复的单词?
不幸的是,我对这方面的知识非常基础,通常我要做的是尝试各种事情,直到获得成功。我也尝试过在这里做,但我不知道该怎么做 任何帮助将不胜感激
答案 0 :(得分:0)
需要一点字符串解析。
您的示例通过读取与单词相似(但不完全相同)的令牌来工作。对于您的问题,令牌变为单词或带引号的字符串。您对令牌的定义越复杂,问题就越难解决。尝试从将标记视为同一行上的单词或带引号的字符串开始。跨行用引号引起来的字符串可能要复杂一些。
这里有一个类似的SO问题可以帮助您入门:Reading quoted string in c++。您需要执行类似的操作,但是除了设置位置之外,带引号的字符串可以出现在行中的任何位置。因此,您读取令牌的内容如下:
希望有帮助