C ++相当于这个字典/列表的Python代码?

时间:2012-09-02 06:26:58

标签: c++ visual-studio-2010 windows-7 python-3.2

在我的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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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();
  }
}

答案 2 :(得分:1)

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

因此,虽然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 ++代码放到某个函数中,比如说,调用cppMain,然后从你的main函数中调用它(甚至更多) -structure定义!):

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工作而设计的工具。

答案 3 :(得分: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也会一样。