C++ 在交换机机箱内使用std::map
我有这个:C++ 在交换机机箱内使用std::map,c++,map,switch-statement,C++,Map,Switch Statement,我有这个: map<string,int> a; int b; 但它不能编译。如何正确实现这一点?开关条件必须是常量,因此您不可能在此处执行此操作 最好使用一些if语句。开关条件必须是常量,因此您不可能在此处执行此操作 最好使用一些if语句。开关/大小写用于常量(例如,enum,ints等)。 您可以使用map::iterator运行这些值并与b进行比较 for(map<string,int>::const_iterator it = a.begin(), end =
map<string,int> a;
int b;
但它不能编译。如何正确实现这一点?
开关
条件必须是常量,因此您不可能在此处执行此操作
最好使用一些
if
语句。开关
条件必须是常量,因此您不可能在此处执行此操作
最好使用一些
if
语句。开关/大小写
用于常量(例如,enum
,int
s等)。您可以使用
map::iterator
运行这些值并与b
进行比较
for(map<string,int>::const_iterator it = a.begin(), end = a.end(); it != end; it++)
{
if(it->second == b)
{
...
break;
}
}
for(map::const_迭代器it=a.begin(),end=a.end();it!=end;it++)
{
如果(它->秒==b)
{
...
打破
}
}
这样,如果a
足够大,就可以避免代码重复进行比较
此外,您还可以探索将循环替换为的选项。
开关/大小写
用于常量(例如,enum
,int
s等)。您可以使用
map::iterator
运行这些值并与b
进行比较
for(map<string,int>::const_iterator it = a.begin(), end = a.end(); it != end; it++)
{
if(it->second == b)
{
...
break;
}
}
for(map::const_迭代器it=a.begin(),end=a.end();it!=end;it++)
{
如果(它->秒==b)
{
...
打破
}
}
这样,如果a
足够大,就可以避免代码重复进行比较
此外,您还可以探索将循环的替换为的选项。您不能。
switch语句中case
之后的表达式必须是整数编译时常量。因此,使用一个文本(42
)或枚举值初始化一个文本(const int x=66
…case x:
)或常量int变量。就这样
如此严格的原因是效率。编译器通常为每个案例
创建标签,如果您在编译时知道每个标签的值,您可以进行一些很好的优化,以避免正常代码分支所带来的大部分开销
在您的情况下,只需使用if-else:
if(b == a["someStr1"]) {
//...
} else if(b == a["someStr2"]) {
//...
} // and so on
你不能。
switch语句中case
之后的表达式必须是整数编译时常量。因此,使用一个文本(42
)或枚举值初始化一个文本(const int x=66
…case x:
)或常量int变量。就这样
如此严格的原因是效率。编译器通常为每个案例
创建标签,如果您在编译时知道每个标签的值,您可以进行一些很好的优化,以避免正常代码分支所带来的大部分开销
在您的情况下,只需使用if-else:
if(b == a["someStr1"]) {
//...
} else if(b == a["someStr2"]) {
//...
} // and so on
@菲波:是的,这是第一件发生的事。这是非法的。Thanx,但是有更优雅的解决方案吗?@Fippo您可以有一个从int
到回调的映射。很抱歉,键入问题时打印错误。@Fippo查找回调。如果你知道回调是什么,它应该非常直接。@Fippo是的,这是第一个弹出的东西。这是非法的。Thanx,但是有更优雅的解决方案吗?@Fippo您可以有一个从int
到回调的映射。很抱歉,键入问题时打印错误。@Fippo查找回调。如果您知道回调是什么,它应该非常简单。可能是编译时的错误解释了为什么.switch只对int等序数起作用。您需要进行=
比较,比如If(“someStr1”==a){do something;}
您可以添加编译过程中出现的错误吗?您可以使用字符串和函数指针的映射,只需迭代映射容器即可调用每个函数。编译时出现的错误可能解释了原因。switch仅适用于整数之类的序数,您需要进行=
比较,如if(“someStr1”==a){do something;}
您可以添加编译过程中出现的错误吗?您可以使用字符串和函数指针的映射,只需迭代映射容器即可调用每个函数。