在交换机案例中交叉初始化map迭代器

时间:2016-05-01 16:48:45

标签: c++ iterator switch-statement

最近我使用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,则代码会正确编译。谁能告诉我这种方法有什么不对?

1 个答案:

答案 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;      
    }
    ...
}