如何检查向量中是否存在元素?

时间:2010-10-30 09:30:32

标签: c++ vector

这在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])

?关于如何使其变得更好或更优雅的任何其他建议?

5 个答案:

答案 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_ofany_ofnone_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))。