这在Visual C ++ 2010 Express上编译并运行正常,但它只检查[2]元素:“Fish”。
int main()
{
vector<string> words;
string temp;
vector<string> disliked(3);
disliked[0] = "Broccoli";
disliked[1] = "Mushrooms";
disliked[2] = "Fish";
while (cin >> temp)
words.push_back(temp);
cout << "Number of words: " << words.size() << endl;
for (int i=0; i<words.size(); ++i) {
if (words[i]!=disliked[2])
cout << words[i] << " ";
else cout << "BLEEP" << " ";
}
cout << endl;
keep_window_open();
return 0;
}
如何在不键入的情况下检查所有向量元素:
if (words[i]!=disliked[0] && words[i]!=disliked[1] && words[i]!=disliked[2])
?关于如何使其变得更好或更优雅的任何其他建议?
答案 0 :(得分:9)
if (std::find(disliked.begin(), disliked.end(), words[i]) == disliked.end()) {
cout << words[i] << " ";
} else {
cout << "BLEEP" << " ";
}
如果您将std::vector<string> disliked(3);
替换为std::set<string> disliked;
,则效果会更快。
std::set<string> disliked;
disliked.insert("Broccoli");
disliked.insert("Mushrooms");
disliked.insert("Fish");
//....
if (disliked.find(words[i]) == disliked.end()) {
cout << words[i] << " ";
} else {
cout << "BLEEP" << " ";
}
答案 1 :(得分:2)
C ++ 0x引入了三种您可能想要查看的算法:all_of
,any_of
和none_of
。
#include <algorithm>
#include <functional>
for (vector<string>::size_type i = 0; i < words.size(); ++i)
{
if (any_of(disliked.begin(),
disliked.end(),
bind2nd(equal_to<string>(), words[i])))
{
cout << "BLEEP" << " ";
}
else
{
cout << words[i] << " ";
}
}
但正如Alexey已经指出的那样,在这种特殊情况下,你可能会更好地使用std::set
。你也可以在向量上做binary_search
,但是你必须确保它的排序。
(另请注意,我将循环计数器类型从int
更改为vector<string>::size_type
。)
答案 2 :(得分:1)
您可以使用std::find
来搜索向量中的单词。但一般来说,向量不适用于这种随机访问查找。您可能需要考虑使用std::set
来存储您不喜欢的食物。
然后你可以说:
std::set<std::string> dislike;
dislike.insert("Broccoli");
dislike.insert("Mushrooms");
dislike.insert("Fish");
...
if (dislike.find("whatever") != dislike.end()) std::cout << "BLEEP" << std::endl;
另外,考虑使用“BLEEP”替代咒语。
答案 3 :(得分:1)
虽然其他方法包括set或std :: find实际上非常好而且快,
你应该能够自己理解如何制作它
如果您想检查words
中的所有元素,而不是disliked
中的所有元素,那么您实际上需要另一个for
循环。
for (std::size_t i = 0; i < words.size(); ++i) {
bool found = false;
for (std::size_t j = 0; j < disliked.size(); ++j) {
if (words[i] == disliked[j]) {
found = true;
break;
}
if (not found)
cout << words[i] << " ";
else
cout << "BLEEP" << " ";
}
这基本上是您使用std::find
调用的代码。请注意,find
std::set
方法使用的方法通常使用red-black tree来实现,效率更高。
答案 4 :(得分:0)
你基本上想要检查所有元素是否相同。最好的想法是使用set。如果你需要vector for other,最快的方法是对vector进行排序,看看它是否相同(O(n log(n)+ n))。如果你的向量不大,2 for循环的答案将完成工作(O(n ^ 2))。