最近我使用std::map
尝试了一个程序,遇到了我需要在切换案例中使用地图iterator
的情况。我的程序是这样的: -
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
map<string,int> m;
//map<string,int>::iterator itr;
int q, mark, type;
string name;
cin >> q;
while (q--)
{
cin >> type;
switch (type)
{
case 1: cin >> name >> mark;
m[name] += mark;
break;
case 2: cin >> name;
m.erase(name);
break;
case 3: cin >> name;
auto itr = m.find(name);
if (itr != m.end())
cout << itr->second << '\n';
else
cout << "0";
break; // problem lies here
default: cout << "ERROR !!!\n"; break;
}
}
return 0;
}
对于此代码,我的编译器闪烁错误: -
Error] crosses initialization of 'std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, int> > itr'
如果我在iterator itr
之外声明switch case
,则代码会正确编译。谁能告诉我这种方法有什么不对?
答案 0 :(得分:4)
您应该考虑在C和C ++中switch
是基于goto
实现的,并且不允许goto
跳过对象的初始化。
将每个case
包装在一个块{ ... }
中,一切都应该没问题。创建问题的案例是itr
。
switch (type)
{
case 1: {
cin >> name >> mark;
m[name] += mark;
break;
}
...
case 3: {
cin >> name;
auto itr = m.find(name);
...
break;
}
...
}