【问题标题】:Why does map become empty outside the (switch) case?为什么 map 在 (switch) 情况下会变空?
【发布时间】:2020-12-04 08:40:08
【问题描述】:

我有以下代码,我在其中初始化我的地图inserts,并查看第一种情况下数据是否输入正确。然后我在case 2中再次查看我的数据,但它显示它在case 2中为空,但在case 1中存在。我从未见过这种行为。

int main() {
    int t;
    cin>>t;
    while(t--) {
        int n, m;
        cin>>n>>m;
        while(m--) {
            string s;
            map<vector<int>, int> inserts;
            int x, y, z, W;
            int x1, y1, z1, x2, y2, z2;
            cin>>s;
            switch(resolveOptions(s)) {
                case update:
                    cin>>x>>y>>z>>W;
                    inserts.insert({{x,y,z}, W});
                    cout<<"Inserts in u: ";
                    showInserts(inserts);
                break;
                case query:
                    cin>>x1>>y1>>x1>>x2>>y2>>z2;
                    cout<<"inserts in q";
                    showInserts(inserts);
                // calculateSum(x1, y1, z1, x2, y2, z2, inserts)<<endl;
                break;
            }
        }
    }

showInserts(inserts) 显示地图

我不习惯用 C++ 编程。

【问题讨论】:

  • 请注意,在发布答案后 对您的问题进行“大量”编辑可能会导致问题。此类更改可能会使善意发布的答案无效。在这种情况下,并没有造成真正的损害,但您应该意识到潜在的后果。

标签: c++ dictionary hashmap g++ c++17


【解决方案1】:

map&lt;vector&lt;int&gt;, int&gt; inserts; 行声明了一个变量,该变量对于它所在的函数来说是本地的。每次调用该函数时,都会创建变量的新“版本”(并初始化为空映射)。当函数返回时,inserts 对象被销毁。

如果您希望 inserts 对象在函数调用之间保留其值,则需要将其声明为全局变量(在函数外部/之前)。


同样的原则也适用于在forwhile 循环中声明的变量:该变量的范围循环的一次迭代;每次循环运行时,都会创建一个变量的新实例,并且当循环的每个迭代结束时,该变量就会被销毁。在这种情况下,您需要在循环之外/之前声明和初始化变量。

【讨论】:

  • 请再核对一下代码,这是实际代码
  • @VedantK 好吧,经过一些小的修改,我的答案仍然成立。 (假设您显示的代码是函数的主体。)
  • 代码在一个循环中,都在同一个函数中。基本上没有函数调用
  • @VedantK 查看编辑:同样的“原则”在起作用——每次运行循环时,您都在声明一个新的 local 变量。
【解决方案2】:
#include<bits/stdc++.h>
using namespace std;
map<vector<int>, int> inserts;
void test(int n) {

    int x, y, z, W;
    int x1, y1, z1, x2, y2, z2;
    cin>>s;
    switch(resolveOptions(s)) {
        case update:
            cin>>x>>y>>z>>W;
            inserts.insert({{x,y,z}, W});
            cout<<"Inserts in u: ";
            showInserts(inserts);
            break;
        case query:
            cin>>x1>>y1>>x1>>x2>>y2>>z2;
            cout<<"inserts in q";
            showInserts(inserts);
            // calculateSum(x1, y1, z1, x2, y2, z2, inserts)<<endl;
            break;
    }
}

int main() {
    test(1);
    test(2);
}

只需声明 map 插入;全球保持其价值。

【讨论】:

  • 请再次查看代码,这是实际代码
  • 更新了答案@VedantK。我希望你在代码中拥有所有剩余的功能。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2012-10-21
  • 2016-09-18
相关资源
最近更新 更多