12

我是新来的 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

4

8 回答 8

17

你可以使用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::setor可能会更好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.
于 2013-01-25T04:22:38.613 回答
2

使用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++11std::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;
}

或拉姆达:

if (std::find_if(std::begin(mylist), std::end(mylist),
     [](const std::string& s){ return s == "b";}) != std::end(mylist))
于 2013-01-25T04:28:10.873 回答
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::begin并且std::end将其简化为:

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

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

于 2013-01-25T04:21:43.137 回答
2

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

如果 number > 0,则表示字符串在字符串中。

于 2019-05-28T05:29:23.803 回答
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()) {
    ..
  }
于 2013-01-25T04:22:22.787 回答
0
if (find(mylist, &mylist[3], myinput) != &mylist[3])
    ...
于 2013-01-25T04:22:26.200 回答
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
    }
}
于 2013-01-25T04:23:56.410 回答
0

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

for (int i = 0; i < mylist.size() ; i ++){
        if (myinput == mylist[i]){
               //Do Stuff
        }
于 2013-01-25T06:37:34.433 回答