如何让我的单词查找更清晰,更高效?

时间:2018-04-11 19:50:11

标签: c++

编写一个程序,“淹没”你不喜欢的单词;也就是说,你用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循环会不那么沉重?

2 个答案:

答案 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;
}