在我的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;
答案 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
也会一样。