【问题标题】:Getting unexpected result in unordered map在 unordered_map 中得到意外结果
【发布时间】:2021-05-08 17:24:12
【问题描述】:

当我的 nums 向量为 [1,3,5,7,9,11,13] 时,为什么输出为 13 11 9 7 5 3 5 7 9 11 13 12 10 8 6 4。 我认为它应该是 1 3 5 7 9 11 13 的组合之一。

class Solution {
public:
    int findLHS(vector<int>& nums) {
        unordered_map<int,int> m;
        for(auto e:nums){
            m[e]++;
        }
        int maxLen=0;
        for(auto it=m.begin();it!=m.end();it++)
        {
            int ele=it->first;
            cout<<ele<<" ";
            if(m[ele-1])
                maxLen=max(maxLen,(m[ele]+m[ele-1]));
            if(m[ele+1])
                maxLen=max(maxLen,(m[ele]+m[ele+1]));
                
        }
        return maxLen;
        
    }
};

【问题讨论】:

    标签: c++ stl unordered-map


    【解决方案1】:

    你有两个问题:

    1. if(m[ele-1]) 将插入一个带有键 ele-1 的新(默认构造)元素,如果它不存在,就像 documented 一样(ele+1 版本也是如此)

      这是一个逻辑错误,因为您的程序正在做的事情虽然定义明确,但并不是您想要的。如果您想在没有默认构造的情况下找出某物是否存在,您应该使用find

    2. 当你改变容器时(通过插入一个元素而不是finding) - 这可能会使你用来遍历容器的迭代器失效。同样,请参阅相同的文档:

      如果发生插入并导致容器重新散列,则所有迭代器都将失效。

      这是一个更严重的错误,因为继续使用那些迭代器根本就是未定义的行为。这不是逻辑错误,而是错误。

    合理的代码可能看起来像

            for(auto it=m.begin(); it!=m.end(); it++)
            {
                cout << it->first <<" ";
                auto pred = m.find(it->first - 1);
                auto succ = m.find(it->first + 1);
    
                if(pred != m.end())
                    maxLen=max(maxLen, it->second + pred->second);
                if(succ != m.end())
                    maxLen=max(maxLen, it->second + succ->second);       
            }
    

    【讨论】:

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