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が string に含まれているかどうかを使用して確認するにはどうすればよい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.

これは 3 つの文字列だけで問題なく機能しますが、さらに多くの文字列を使用する場合は、代わりに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::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()メンバーを使用する場合、これはあまり必要ではありませんが、より汎用性があります。

于 2013-01-25T04:21:43.137 に答える
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::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))
于 2013-01-25T04:28:10.873 に答える
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 に答える