【问题标题】:How to check if a string is in a list of strings?检查字符串是否在字符串中(字符串列表)
【发布时间】:2013-01-09 00:45:05
【问题描述】:

我是 C++ 新手。我在 python 方面有一些经验,发现“if a in b”真的很容易,我想知道 C++ 中是否有等价物。

背景

我一直在尝试制作一个字符串列表并检查输入是否在该列表中。 我想这样做的原因是因为我只想在输入实际上会在该函数中执行某些操作时才使用该函数。 (在这种情况下更改 int x 和 y 坐标)

问题

string myinput;
string mylist[]={"a", "b", "c"};
cin>>myinput;
//if myinput is included in mylist
//do other stuff here

如何使用if 检查输入myinput 是否包含在字符串mylist 中?

【问题讨论】:

标签: c++ string if-statement input cin


【解决方案1】:

你也可以使用std::count

#include <iostream>
#include <algorithm>  // std::count
#include <vector>

//using namespace std;

int main() {
    std::vector<std::string> ans = {"a", "b", "c", "a"};
    std::cout << count(ans.begin(), ans.end(), "a") << std::endl;
    return 0;
}

如果是数字&gt; 0,则表示该字符串在字符串中。

【讨论】:

    【解决方案2】:

    你可以使用std::find:

    std::string myinput;
    std::vector<std::string> mylist{"a", "b", "c"};
    
    std::cin >> myinput;
    if (std::find(std::begin(mylist), std::end(mylist), myinput) != std::end(mylist))
        // myinput is included in mylist.
    

    这仅适用于三个字符串,但如果您要拥有更多字符串,则最好使用std::setstd::unordered_set

    std::set<std::string> myset;
    // put "a", "b", and "c" into the set here
    
    std::cin >> myinput;
    if (myset.find(myinput) != myset.end())
        // myinput is included in myset.
    

    【讨论】:

    • +1:插入到集合中不会是 O(1) 或 O(n)。所以这取决于真正需要什么(快速插入/快速搜索)
    • @Chubsdad:在通常情况下,插入集合将是 O(log n)。至少在典型情况下,无论如何您都希望搜索多于插入。当然,如果你使用unordered_set,你可以期望插入也是O(1)。
    • 添加头文件&lt;algorithm&gt;
    【解决方案3】:

    您可以按照其他人的建议使用 find ,也可以使用 for 循环(初学者更容易):

    for (int i = 0; i < mylist.size() ; i ++){
            if (myinput == mylist[i]){
                   //Do Stuff
            }
    

    【讨论】:

      【解决方案4】:

      使用std::find, std::find_if算法

        string myinput;
        string mylist[]={"a", "b", "c"};
      
        std::string *begin = mylist;
        std::string *end = mylist + 3;
      
        if (std::find(begin, end, "b") != end)
        {
          std::cout << "find" << std::endl;
        }
      

      或者使用 C++11 std::arraystd::begin(), std::end()

      std::array<std::string, 3> mylist = { "a", "b", "c" };
      
      if (std::find(std::begin(mylist), std::end(mylist), "b") != std::end(mylist))
      {
        cout << "find" << endl;
      }
      

      或 Lambda:

      if (std::find_if(std::begin(mylist), std::end(mylist),
           [](const std::string& s){ return s == "b";}) != std::end(mylist))
      

      【讨论】:

        【解决方案5】:

        使用std::find:

        std::size_t listsize = sizeof mylist / sizeof mylist[0];
        if (std::find(mylist, mylist + listsize, myinput) != mylist + listsize) {
            //found
        }
        

        如果您事先知道列表的大小,我建议您使用std::array,它公开了迭代器和size() 函数,以及与内置数组相比的其他一些好处。请注意,这仅适用于 C++11(C++03 几乎等同于 std::vector),C++11 还附带 std::beginstd::end,将其简化为:

        if (std::find(std::begin(mylist), std::end(mylist), myinput) != std::end(mylist))
        

        在 C++03 中为内置数组创建自己的数组也相当容易,但是使用公开 begin()end() 成员的标准容器,这应该不是太必要,尽管它是更通用。

        【讨论】:

        • @Potatoswatter,没错,我会在 std::array 注释中添加它。
        • 谢谢,虽然我希望有一些更简单的东西,但我想我必须尝试了解如何使用它。
        • @Sumyjkl:它就像在 Python 中一样简单,唯一的区别是语法,但发生的事情实际上是一样的。在不使用 STL 的情况下使用 C++ 就像在没有包含 API 的情况下使用 python
        • @Sumyjkl,这只是最初的概念。 find() 搜索您指定的范围(使用 begin 和 end 函数更容易注意到)并返回找到它的位置(迭代器),如果不是,则返回范围的结尾。这就是为什么您必须将结果与您传入的结束位置进行比较。整个sizeof 业务将数组的总大小除以一个元素的大小,给出元素的数量,但如前所述,标准容器暴露一个简单的size() 成员,尽管在这种情况下它不是很有用。
        【解决方案6】:
        #include <algorithm>
        #include <iostream>
        #include <string>
        
        using namespace std;
        
        int main()
        {
            string myinput;
            string mylist[]={"a", "b", "c"};
            if (cin >> myinput && 
                std::find(std::begin(mylist), std::end(mylist), myinput) == std::end(mylist))
            {
                // do other stuff
            }
        }
        

        【讨论】:

          【解决方案7】:
          if (find(mylist, &mylist[3], myinput) != &mylist[3])
              ...
          

          【讨论】:

            【解决方案8】:

            既然您正在使用 C++,请不要犹豫使用 STL 库:

              string mylist[]={"a", "b", "c"};
              vector<string> myvector(mylist, mylist + sizeof(mylist)/sizeof(mylist[0])); 
            
              if (find(myvector.begin(), myvector.end(), mystring) != myvector.end()) {
                ..
              }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-04-29
              • 2015-05-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-18
              相关资源
              最近更新 更多