编写一个程序,“淹没”你不喜欢的单词;也就是说,你用cin阅读并打印它们 再次在cout上。如果一个单词是你定义的几个单词之一,你就会写出BLEEP而不是那个单词。从...开始 一个“不喜欢的词”,如 string disliked =“Broccoli”; 当它工作时,再添加一些。
所以我在考虑如何创建一个代码,用一组使用向量的单词来做到这一点,但我能想到的只有
int main()
{
vector<string> disliked = { "damn","stupid","fat" };
string word = "";
while (cin >> word) {
bool bad = false;
for (string x : disliked) {
if (x == word)
bad = true;
}
if (bad)
cout << "Bleep\n";
else
cout << word << "\n";
}
return 0;
}
我觉得可以通过取出其中一个if语句来缩短代码,但我找不到有效的方法。 总的来说,这个简单的检查似乎比它应该有更多的代码,也可以更好地完成部分工作?做一个整个向量的整个循环似乎太资源密集,在这个例子中,向量可以说1000个单词,可能用if语句将它分开检查ad,fj ...等,然后只运行一个for循环会不那么沉重?
答案 0 :(得分:3)
对矢量进行排序并使用std::binary_search
:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<std::string> disliked = { "damn","stupid","fat" };
sort(std::begin(disliked), std::end(disliked));
std::string word = "";
while (std::cin >> word)
{
if ( binary_search(std::begin(disliked), std::end(disliked), word))
{
std::cout << "Bleep ";
}
else
{
std::cout << word;
}
}
}
或使用std::set
代替vector:
#include <iostream>
#include <set>
#include <algorithm>
int main()
{
std::set<std::string> disliked = { "damn","stupid","fat" };
std::string word = "";
while (std::cin >> word)
{
if ( disliked.find(word) != std::end(disliked) )
{
std::cout << "Bleep ";
}
else
{
std::cout << word;
}
}
}
这两种解决方案对于单词查找而言都具有对数复杂度而非线性。
答案 1 :(得分:1)
对向量使用std::find
操作。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<string> disliked = { "damn","stupid","fat" };
string word = "";
while (cin >> word) {
if ( std::find(disliked.begin(), disliked.end(), word) != disliked.end() )
{
cout << "Bleep ";
}
else
{
cout << word;
}
}
return 0;
}