web-dev-qa-db-ja.com

文字列が文字列(文字列のリスト)にあるかどうかを確認します

私はここと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を使用して確認するにはどうすればよいですか?

9
Sumyjkl

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.

これは3つの文字列だけで問題なく機能しますが、さらに多くの文字列を使用する場合は、代わりに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.
13
Jerry Coffin

使用 _std::find_

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

リストのサイズを事前に知っている場合は、イテレータとsize()関数を公開する_std::array_と、組み込み配列に勝るその他のいくつかの利点をお勧めします。これは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()メンバーを公開する標準コンテナーを使用する場合、これもそうすべきではありません。より用途が広いですが、必要です。

2
chris

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;
}
_

またはラムダ:

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

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
Jack
if (find(mylist, &mylist[3], myinput) != &mylist[3])
    ...
0
user1610015
#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
Denis

他の人が提案したようにfindを使用することも、forループを使用することもできます(初心者向け):

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

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の場合、文字列が文字列内にあることを意味します。

0
Hu Xixi