将进攻性句子列入黑名单

时间:2016-03-08 00:14:35

标签: c++ templates vector

我创建了一款面向年轻观众的游戏,并试图过滤掉亵渎和冒犯的名字

#include <iostream>
#include <vector>

bool isBanned( std::string text ) {
    std::vector bannedSent = {
        "Profanity1",
        "Profanity2",
        "Profanity3",
        "Profanity4"
    };
    for(auto &i : bannedSent) {
        if(text == i) { return true; }
    }
    return false;
}

我在编写错误时谈到“模板参数”,与std::vector一致,这是什么意思?

4 个答案:

答案 0 :(得分:7)

您需要为矢量提供模板参数。由于你持有字符串,你需要声明它:

std::vector< std::string > bannedSent = {
   "Gosh",
   "Golly",
   "Jeepers",
   "Troll"
};

答案 1 :(得分:3)

最简单的解决方案实际上是而不是来指定类型。编译器已经有了一个不错的主意,你已经知道了关键字:

auto bannedSent = {
    "Profanity1",
    "Profanity2",
    "Profanity3",
    "Profanity4"
};
for(auto i : bannedSent) { ...

附带好处:这可以避免在每次调用中构造4个std::string个对象。

请注意,您之前使用过auto& i。这是一个错误,你不打算改变bannedSent

答案 2 :(得分:1)

如果应该是std::vector<std::string>

bool isBanned( std::string text ) {
    std::vector<std::string> bannedSent = {
    ...
    }
}

答案 3 :(得分:1)

由于您包含C ++ 11标记,因此您还可以使用any_of()

#include <vector>
#include <string>
#include <algorithm>

bool isBanned(const std::string & text)
{
    const std::vector<std::string> bannedSent = {
        "Profanity1",
        "Profanity2",
        "Profanity3",
        "Profanity4",
    };
    return std::any_of(bannedSent.begin(), bannedSent.end(), [text](std::string &s){return s == text; });
}