如何使用c ++

时间:2019-04-30 15:03:36

标签: c++

我使用此功能删除文件中的重复单词 但是我需要它来删除重复的表达式

例如,该函数当前正在做什么      如果我有表达      “你好,世界”      “美丽的世界” 该函数将从两个表达式中删除单词“ 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;
}

如何删除重复的表达式而不是重复的单词?

不幸的是,我对这方面的知识非常基础,通常我要做的是尝试各种事情,直到获得成功。我也尝试过在这里做,但我不知道该怎么做 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

需要一点字符串解析。

您的示例通过读取与单词相似(但不完全相同)的令牌来工作。对于您的问题,令牌变为单词或带引号的字符串。您对令牌的定义越复杂,问题就越难解决。尝试从将标记视为同一行上的单词或带引号的字符串开始。跨行用引号引起来的字符串可能要复杂一些。

这里有一个类似的SO问题可以帮助您入门:Reading quoted string in c++。您需要执行类似的操作,但是除了设置位置之外,带引号的字符串可以出现在行中的任何位置。因此,您读取令牌的内容如下:

  1. 阅读下一个单词标记(如您现在所做的那样)
  2. 如果最后读取的令牌是引号字符(“),则将其作为单个令牌读取到下一个(”)
  3. 仅在设置和输出令牌不存在的情况下对其进行检查(如果已对令牌进行了引号,请不要忘记输出引号)
  4. 将令牌插入集合。
  5. 重复直到EOF

希望有帮助