0

在我的 Python 代码中,我有一个问题需要在开始翻译成 c++ 之前加以澄清:如何制作正确的字典/列表,我可以在其中使用相当于“if var in _ ”的内容。

需要翻译的任意示例:

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++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 回答
1

嗯,C++ 不太适合小型临时程序,因为它没有提供太多的基础结构。您打算在标准库之上创建自己的基础结构(例如,甚至只是简单的集合!)。或者使用一些 3 rd方库,即您的选择

因此,虽然 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 年 Visual C++ 不支持 C++11 花括号列表初始化。

这里set 来自std::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 ); }

但这就是全部,除了你必须将我首先展示的 C++ 代码放入某个函数中,比如说,调用 that cppMain,然后从你的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 回答
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 回答