如何检查一个字符串是否在一个字符串列表中?

15

在Python中,执行if a in b非常容易,我想知道C++中是否有类似的语句。

具体地说,我想创建一个字符串列表,并检查输入是否在该列表中。

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

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


假设你的 mylist 只包含唯一值? - Srinivas
https://dev59.com/Hm025IYBdhLWcg3wJCRD - user2009744
8个回答

21

你可以使用 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::set 或者std::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
2
@Chubsdad:在通常情况下,集合中的插入操作将是O(log n)。无论如何,你预计搜索的次数都会比插入多。当然,如果你使用unordered_set,你也可以期望插入操作是O(1)的。 - Jerry Coffin
添加头文件 <algorithm> - tjysdsg

3

使用 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::array,并配合使用std::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))

3
您也可以使用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;
}

如果数字> 0,意味着该字符串在字符串中。最初的回答已经涵盖了这一点。

2

使用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注释中添加这个。 - chris
谢谢,虽然我希望有更简单的方法,但我想我必须尝试理解如何使用它。 - Sumyjkl
@Sumyjkl:这就像在Python中一样简单,唯一的区别是语法,但发生的事情确实是相同的。使用C++而不使用STL就像使用未包含API的Python一样。 - Jack
@Sumyjkl,这只是初步概念。find()会在你指定的范围内搜索(使用begin和end函数更容易注意到),并返回找到的位置(迭代器),如果没有找到,则返回范围的末尾。这就是为什么你必须将结果与传入的结束位置进行比较。整个sizeof操作将数组的总大小除以一个元素的大小,得到元素的数量,但正如提到的,标准容器公开了一个简单的size()成员,虽然在这种情况下它不太有用。 - chris

1

既然你在使用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()) {
    ..
  }

1

你可以像其他人建议的那样使用find方法,或者你可以使用for循环(对于初学者来说更容易):

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

这个方法在执行时没有任何问题,同时对于初学者来说也很简单。然而,与本帖中提出的其他解决方案相比,它的逻辑性较差。 - Andrew

0
#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
    }
}

0
if (find(mylist, &mylist[3], myinput) != &mylist[3])
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接