Более простой способ для нескольких тестов if-else - PullRequest
0 голосов
/ 08 октября 2019

У меня есть строка, и я хочу выполнить оператор if, если значение строки соответствует заданному набору слов (скажем, обезьяна, еда, сон, манго ........)

Я могуdo: -

if(name=="ape" || name=="eat".............)

Есть ли какой-нибудь более простой способ сделать это?

Я хочу использовать ТОЛЬКО if-else.

Ответы [ 5 ]

2 голосов
/ 08 октября 2019

Нет, если вы хотите оставить только if и else без добавления чего-либо.

В противном случае вы можете использовать std::unordered_set, заполнить его этими словами и использовать find().

2 голосов
/ 08 октября 2019

Удалите массив слов и затем используйте стандартный алгоритм std::find или std::any_of.

, например

const char * words[] =
{
    "ape", "eat", "sleep", "mango"
}; 

if ( std::find( std::begin( words ), std::end( words ), name ) != std::end( words ) )
{
   //...
}

, если вы объявите отсортированный массив, тогда выможно использовать стандартный алгоритм std::binary_search.

Вот демонстрационная программа

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main() 
{
    const char * words[] =
    {
        "eat", "ape", "mango", "sleep" 
    };

    std::string name( "mango" );

    if ( std::binary_search( std::begin( words ), std::end( words ), name ) )
    {
        std::cout << name << " is a correct name\n";
    }

    return 0;
}

Ее вывод

mango is a correct name

Или поместить слова в стандартный контейнер какнапример std::set и использовать метод поиска контейнера.

1 голос
/ 08 октября 2019
for(auto pattern: {"ape", "eat"}) {
   if(name == pattern) {
      // all the consequences here
      break;
   }
}

В качестве альтернативы, вы можете использовать что-то вроде хеш-набора:

static const std::unordered_set<std::string> words{"ape", "eat"};
if(words.find(name) != words.end()) {
}

Просто убедитесь, что это static const, чтобы не повторять его каждый раз заново. Вероятно, было бы лучше, если бы у вас был настоящий огромный набор шаблонов, позволяющих.

0 голосов
/ 10 октября 2019

Если вы не заботитесь о производительности, но хотите иметь минимальный код, создайте одну строку std :: string, содержащую все слова, разделенные отдельным символом разделителя, также в начале и в конце. Затем std::string::find() ваше поисковое слово также будет заключено в символ-разделитель:

static const std::string words("^ape^stuff^dude^");
if (words.find("^"+name+"^") != words.npos)
    std::cout << "found it";

Или откажитесь от const std :: string и используйте strstr из клипа.

0 голосов
/ 08 октября 2019

Вы можете использовать unordered_set строки и искать имя. Примерно так:

 #include <iostream>
 #include <unordered_set>
 #include <string>
 #include <algorithm>

 int main()
 {
     std::unordered_set<std::string> values = { "ape", "stuff", "dude" };


     std::string name = "ape";

     if (std::find(std::begin(values), std::end(values), name) != std::end(values)) {
         std::cout << "found it";
     } else {
         std::cout << "no found it";
     }

     return 0;
 }

Спасибо Sombrero Chicken за упоминание unordered_set. Я по умолчанию на вектор. Может быть какая-то версия C ++ 17 / C ++ 20 с constexpr unordered_set. Но я оставляю это кому-то еще.

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