0

私のPythonコードには、c ++への翻訳を開始する前に明確にする必要がある問題があります。それは、で「if varin_」に相当するものを使用できる適切な辞書/リストを作成する方法です

翻訳が必要な任意の例:

CONFIRMATION = ('yes', 'yeah', 'yep', 'yesh', 'sure', 'yeppers', 'yup')
DECLINATION = ('no', 'nope', 'too bad', 'nothing')

varResponse = str(input('yes or no question'))
if varResponse in CONFIRMATION: 
    doSomething()
elif varResponse in DECLINATION: 
    doSomethingElse()
else:
    doAnotherThing()

次のような配列を使用して、同様のタスクを実行するのはかなり簡単です。

if (userDogName == name[0])
    execute something;

しかし、私が必要としているのは次のようなものです。

if (userDogName is one of a population of dog names in a dictionary)
    execute something;
4

4 に答える 4

2

STLコンテナクラスを使用できますset。バランスの取れた二分木を使用します。

#include <iostream>
#include <set>
#include <string>

int main(int argc, char* argv[])
{
  std::set<std::string> set;
  std::set<std::string>::const_iterator iter;

  set.insert("yes");
  set.insert("yeah");

  iter = set.find("yess");

  if (iter != set.end( ))
  {
    std::cout << "Found:" << *iter;
  }
  else
  {
    std::cout << "Not found!";
  }

  return 0;
}
于 2012-09-02T06:35:20.947 に答える
1

ええと、C ++はインフラストラクチャをあまり提供しないため、小さなスローオフプログラムにはあまり適していません。標準ライブラリの上に独自のインフラストラクチャ(まあ、単なるセットなど)を作成することを目的としています。または、サードパーティのライブラリ、つまり選択したライブラリを使用します

したがって、Pythonにはバッテリーが含まれていますが、C ++では、特定の提供されたバッテリーを受け入れるという強いプレッシャーはありません(バッテリーがないため)が、少なくともバッテリーを選択する必要があります。

基本的なコードについては、Pythonスニペット

CONFIRMATIONS = ("yes", "yeah", "yep", "yesh", "sure", "yeppers", "yup")
DECLINATIONS = ("no", "nope", "too bad", "nothing")

response = raw_input( "yes or no? " )
if response in CONFIRMATIONS:
    pass # doSomething()
elif response in DECLINATIONS:
    pass # doSomethingElse()
else:
    pass #doAnotherThing()

C++では次のようになります。

typedef Set< wstring > Strings;

Strings const   confirmations   = temp( Strings() )
    << L"yes" << L"yeah" << L"yep" << L"yesh" << L"sure" << L"yeppers" << L"yup";
Strings const   declinations    = temp( Strings() )
    << L"no" << L"nope" << L"too bad" << L"nothing";

wstring const response = lineFromUser( L"yes or no? " );
if( isIn( confirmations, response ) )
{
    // doSomething()
}
else if( isIn( declinations, response ) )
{
    // doSomethingElse()
}
else
{
    // doAnotherThing()
}

Setただし、クラスのように、定義されているインフラストラクチャに依存します。

template< class TpElem >
class Set
{
public:
    typedef TpElem      Elem;

private:
    set<Elem>   elems_;

public:
    Set& add( Elem const& e )
    {
        elems_.insert( e );
        return *this;
    }

    friend Set& operator<<( Set& s, Elem const& e )
    {
        return s.add( e );
    }

    bool contains( Elem const& e ) const
    {
        return (elems_.find( e ) != elems_.end());
    }
};

template< class Elem >
bool isIn( Set< Elem > const& s, Elem const& e )
{
    return s.contains( e );
}

operator<<2012年の時点で、VisualC++はC++11中括弧リストの初期化をサポートしていないためです。

これsetstd::set標準ライブラリからのものです。

そして、うーん、temp物事:

template< class T >
T& temp( T&& o ) { return o; }

そして、より多くのインフラストラクチャ、lineFromUser機能:

wstring lineFromUser( wstring const& prompt )
{
    wcout << prompt;

    wstring result;
    getline( wcin, result )
        || throwX( "lineFromUser: std::getline failed" );
    return result;
}

これは、関数に依存していthrowXます:

bool throwX( string const& s ) { throw runtime_error( s ); }

cppMainただし、最初に示したC ++コードを関数に入れて、たとえばそれを呼び出し、関数から呼び出す必要があることを除いて、これですべてですmain(定義するインフラストラクチャがさらに増えます!)。

int main()
{
    try
    {
        cppMain();
        return EXIT_SUCCESS;
    }
    catch( exception const& x )
    {
        wcerr << "!" << x.what() << endl;
    }
    return EXIT_FAILURE;
}

したがって、C ++で中途半端なことを適切に行うには、かなりのオーバーヘッドがあります。

C ++は主に大きなプログラム用であり、Python(私がよく使用する)は小さなプログラム用です。

そして、はい、私は一部の学生がその声明に反応するかもしれないし、反応するであろうことを知っています、彼らはそれが小さなプログラムには良くないと言うのはC ++のスラーだと感じます(ねえ、私はいつもそれらを作ります!)そして/またはそれは大規模なシステムには良くないと言うためにPythonを嘲笑します(YouTubeのことを聞いたことがありませんか、無能な人は馬鹿げていますか?)、しかし、それはそうです。ネジを締める必要のあるハンマーを使用する方が便利な場合もあるので、たとえば、C++を使用して小さな作業を行う場合もあります。しかし、一般的には、手元のマシンにPythonをインストールするのは面倒なので、一般に、タスクXを実行するには、Xのような作業用に設計されたツールを使用するのが最善です。

于 2012-09-02T07:47:30.687 に答える
1

C++11 では、Python コードと非常によく似たソリューションを使用できます。

#include <iostream>
#include <set>
#include <string>

using namespace std;

set<string> CONFIRMATION = {"yes", "yeah", "yep", "yesh", "sure", "yeppers", "yup"};
set<string> DECLINATION = {"no", "nope", "too bad", "nothing"};

int main() {
  cout << "yes or no question";
  string varResponse;
  getline(cin, varResponse);
  if (CONFIRMATION.find(varResponse) != CONFIRMATION.end()) {
    doSomething();
  } else if (DECLINATION.find(varResponse) != DECLINATION.end()) {
    doSomethingElse();
  } else {
    doAnotherThing();
  }
}
于 2012-09-02T07:01:00.703 に答える
0

これはstd::find、任意の標準テンプレート ライブラリ コンテナーを使用して解決できます。

std::vector<std::string> answers;
std::string input;
...
if(std::find(answers.begin(), answers.end(), input) != answers.end()) {
    /* input was found in answers */
} else {
    /* input was not found in answers */
}

std::setリストが大きい場合は、Tilo が提案したように、リストをオブジェクトに格納する方がよい場合があります。std::find同じように動作します。

于 2012-09-02T06:47:34.510 に答える