2016-03-08 29 views
1

我创建了一个游戏意味着年轻观众,我试图筛选出亵渎和冒犯名黑名单进攻句子

#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,这是什么意思?

+2

您忘记指定矢量的类型,即:'std :: vector ' –

+1

您可以使用占位符轻松地替换令人讨厌的文本以达到本示例的目的。 –

+2

对于一个人来说,我有一个非常具体的东西,就像“希特勒没有做错什么”一样。 –

回答

1

如果要std::vector<std::string>

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

您需要提供模板参数到矢量。因为你持有的字符串,你需要声明它是这样的:

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

我不会接受这个,因为“唐纳德特朗普”的评论,保持政治不为此 –

+4

我的道歉。考虑到你的问题的政治参考,我认为这样会很好。 – paddy

+1

这几点会教你,呃@paddy? ;)+1 – erip

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; }); 
} 
+1

为什么不使用'std:find'? – Ferruccio

+0

@Ferruccio:我怀疑这样会更有效率(或者,如果lambda采用引用的方式)。 'std :: find'需要为找到的字符串创建一个迭代器,但你并不需要这么做。当然,检查'text'是否以'Profanity'开始,然后如果它以1和4之间的数字结束将会更有效率;} – MSalters

3

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

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

附带的好处是:避免这种在每次调用构建4个std::string对象。

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

+0

Nice KISS解决方案。 – erip

+0

要小心这个。 bannedSet类型不会是'vector ',而是'initializer_list' – purpletentacle