从字符串中删除重复的单词

问题描述

我有一个ABA AAB BAA BAA ABA AAB 这样的字符串。我想删除重复的单词,从而得到输出 ABA AAB BAA。但是,当我运行下面的代码时,输​​出是 ABA AAB BAA BAA ABA AAB:

// I'm continuously pushing the string
int S = a.size() 
set <string> s;
for(int i = 0; i < S; i++) {
    s.insert(a);
}
for(auto M : s) {
    cout << M << endl;
}

如何在 C++ 中从字符串中删除重复的单词?

解决方法

您走在正确的轨道上。 std::set 是一种有效的方法。

您遇到的问题是您没有从字符串中提取单个单词。您总是尝试将相同的字符串插入到集合中。那行不通。

如果你有一个包含“ABA AAB BAA BAA ABA AAB”的字符串,你希望有子字符串“ABA”、“AAB”、“BAA”、“BAA”、“ABA”、“AAB”

然后,将它们插入集合中。因此,您需要将字符串拆分为许多子字符串,即单词。或者,您也可以说:从字符串中“提取”子字符串。

不幸的是,std::string 没有实现提取运算符,因为它不是流。但是有一个标准程序可以解决这个问题。您可以将 std::string 放入 std::stringstream,然后从那里提取。

例如,你可以写:

#include <iostream>
#include <string>
#include <sstream>
#include <set>

int main() {

    const std::string test{"ABA AAB BAA BAA ABA AAB"};
    std::istringstream iss{test};

    std::set<std::string> uniqueWords{};

    std::string word{};
    while (iss >> word) uniqueWords.insert(word);

    for (const std::string& word : uniqueWords) std::cout << word << '\n';

    return 0;
}
,

了解您所写的内容可能会有所帮助。我假设它并不意味着你认为它的作用,但如果有一个简单的概念问题,我无法从这个小样本中识别出来。

// I'm continuously pushing the string

你没有在任何地方推动任何事情,所以我不明白评论。

int S = a.size() 

这缺少一个 ; 所以它不会编译。这将获取字符串 a 中的字符数。您将其存储在 int 类型的变量中,但 size() 返回 size_t。您没有将其定义为 const,但它永远不会改变。

set <string> s;
for(int i = 0; i < S; i++) {
    s.insert(a);
}

您一遍又一遍地将字符串 a 插入到集合中。这是没有意义的,因为集合不存储重复项,而且这与 a 中的单个单词无关。

我认为您的问题在这里:您不是每次通过循环从 a 插入一些子字符串,而是 a 本身。你为什么要这样做 S 次?也许您从具有单词向量而不是单个字符串的示例中复制了代码。在这段代码中,i 正在计算 s 中有多少个字符。

for(auto M : s) {
    cout << M << endl;
}

输出集合的每个元素。
只有一个元素;字符串 a