Как проверить, нет ли элемента внутри вектора? - PullRequest
3 голосов
/ 30 октября 2010

Это компилируется и работает нормально в 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 ]

9 голосов
/ 30 октября 2010
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" << " ";
}
2 голосов
/ 30 октября 2010

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] << " ";
    }
}

Но, как уже отмечал Алексей, в данном конкретном случаеВы, вероятно, лучше с std::set.Вы также можете сделать binary_search для вектора, но затем вы должны убедиться, что он отсортирован.

(Также обратите внимание, что я изменил тип счетчика цикла с int на vector<string>::size_type.)

1 голос
/ 30 октября 2010

В то время как другие методы, включая 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 использует другой подход, часто реализуемый с использованием красно-чёрного дерева , что намного эффективнее.

1 голос
/ 30 октября 2010

Ну, вы можете просто использовать 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;

Также рассмотрите возможность использования альтернативного объяснительного слова для "бип».

0 голосов
/ 30 октября 2010

Вы в основном хотите проверить, все ли элементы одинаковы. Лучшая идея - использовать набор. Если вам нужен вектор для чего-то другого, самый быстрый способ - это отсортировать вектор, просмотрите его и проверьте, совпадают ли какие-либо последующие элементы (O (n log (n) + n)). Если ваши векторы невелики, то ответ с 2 для циклов сделает работу (O (n ^ 2)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...