在开关盒内使用 std::map
Using std::map inside switch case
>我有这个:
map<string,int> a;
int b;
我想做这个:
switch(b)
{
case a["someStr1"]:
someCode1();
break;
case a["someStr2"]:
someCode2();
break;
etc.
}
但它不会编译。如何正确实现这一点?
switch
条件必须是常量,所以你想在这里做什么是不可能的。
你最好使用一些if
语句。
>switch/case
用于常量(例如,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;
}
}
这样,如果您的a
足够大,则可以避免代码重复进行比较。
此外,您还可以探索将循环替换为for
的选项 for_each
.
你不能。switch 语句中case
后的表达式必须是整型编译时常量。所以一个文字 ( 42
), 常量 int 变量初始化为文字 ( const int x = 66
... case x:
) 或枚举值。仅此而已。
如此严格的原因是效率。编译器通常会为每个case
创建标签,如果您在编译时知道每个标签的值,则可以进行一些不错的优化,以避免正常代码分支的大部分开销。
在您的情况下,只需使用 if-else:
if(b == a["someStr1"]) {
//...
} else if(b == a["someStr2"]) {
//...
} // and so on
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++如何创建 std::map
- 从其他容器中移动构造"std::map"
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- C++ 使用枚举类对象分配 std::map 值
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- std::map:当元素不可默认构造时创建/替换元素
- Arduino编译器和STL:使用std::vector和std::map