Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在交换机机箱内使用std::map_C++_Map_Switch Statement - Fatal编程技术网

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;}
您可以添加编译过程中出现的错误吗?您可以使用字符串和函数指针的映射,只需迭代映射容器即可调用每个函数。