多种if-else测试的简便方法

时间:2019-10-08 13:15:48

标签: c++ algorithm c++11 if-statement

我有一个字符串,并且如果字符串值与给定的一组单词匹配(例如猿,吃,睡,芒果....),我想执行if语句

我可以做到:-

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

有没有更简单的方法可以做到这一点?

我只想使用if-else。

5 个答案:

答案 0 :(得分:2)

先对单词数组进行修饰,然后使用标准算法std::findstd::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,然后使用容器的find方法。

答案 1 :(得分:2)

如果您只想保留ifelse,而又不添加任何内容,那就没有了。

否则,您可以使用std::unordered_set,用这些词填充并使用find()

答案 2 :(得分:1)

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,就不必每次都重新初始化它。如果您拥有一组真正的巨大模式,可能会更好。

答案 3 :(得分:0)

您可以使用字符串的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;
 }

感谢草帽鸡提到了无序设置。我默认为vector。 可能有一些constexpr unordered_set的C ++ 17 / C ++ 20版本。但是我把这个留给别人。

答案 4 :(得分:0)

如果您不关心性能但只需要最少的代码,则构建一个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并使用clib中的strstr