【问题标题】:terminate called after throwing an instance of 'std::out_of_range'?在抛出“std::out_of_range”的实例后调用终止?
【发布时间】:2021-01-02 22:20:07
【问题描述】:

我正在尝试查看 map 中是否存在特定键,如果存在,那么我想将其值增加 1。但是在运行程序时出现错误

在抛出 'std::out_of_range' 的实例后调用终止 什么():地图::在

为什么会这样 out_of_range 有人可以帮忙吗?

b 是这个函数中的一个映射。 itr 是一个用于访问其元素的迭代器

for(int i=0;i<n;i++)
{
        ct=0;
        cin>>a[i];
        for(itr=b.begin();itr!=b.end();itr++)
        {
            if(itr->first==a[i])
                ct++;
            else
                continue;
        }
        if(!ct)
        {
            b.at(a[i])++;
        }
        else
        {
            b.insert(pair <int,int>(a[i],1));
        }
    }

}

【问题讨论】:

  • a 只是一个整数数组。
  • this page about std::map::at,可能a[i]不在map的keyset中,从而导致out_of_range异常。
  • if(!ct) 应该是if(ct)。请注意,您的 for 循环可能应该只替换为 std::map::find
  • 整个外部i 循环体可以用cin &gt;&gt; a[i]; auto p = b.insert({a[i],0}); p.first++; 替换。它也会更有效率。

标签: c++ iterator maps


【解决方案1】:

你可以用 3-4 行来写整个事情:

for (int i = 0; i < n; ++i) {
    cin >> a[i];
    ++b[a[i]];
}

subscript operator 将自动插入 {a[i], 0},如果 a[i] 在映射 b 中不存在作为键。然后递增它使其等效于您尝试插入一对 {a[i], 1} 的代码。


你的方法有什么问题:

你在做b.at(a[i])++之前使用的条件是错误的。应该是if (ct) 而不是if (!ct)

[改进]

您可以在发现itr-&gt;first == a[i] 是真的时添加break。但它的复杂性仍然是时间O(n)。这违背了使用std::map 而不是std::vector&lt;std::pair&lt;int, int&gt;&gt; 的目的。如果您改用std::map::find,则可以以对数时间复杂度执行该操作。 (更多方法here。)

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    相关资源
    最近更新 更多