问题描述
我有一个像 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
。