微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C ++中使用迭代器时出现缓冲区溢出错误

如何解决在C ++中使用迭代器时出现缓冲区溢出错误

这是leetcode的问题: https://leetcode.com/explore/learn/card/fun-with-arrays/521/introduction/3237/

给出一个由整数组成的数组,返回其中有偶数个数字的整数。 在不使用迭代器的情况下尝试通过所有测试用例时,虽然使用了如下所示的迭代器方法,但它显示了缓冲区溢出错误,尽管通过了任何自定义测试用例。

您能否说出这种迭代器方法为何失败,为什么会发生此溢出错误以及如何纠正它?

Buffer Overflow Message

class Solution {
    
    int calculate_digit(int n){
        int count = 0;
        while(n){
            n = int(n/10);
                count++;
        }
        return count;
    }
        
public:
    
    int findNumbers(vector<int>& nums) {
        int check;
        vector<int>::iterator it;
        for (auto it = nums.begin(); it != nums.end(); ++it){
            check = calculate_digit(*it);
            if(check%2 != 0)
                nums.erase(it);            
        }
        
        return nums.size()-1;
        
    }
};

解决方法

只有三个条件(基于约束)会使count递增。我们只需检查一下(O(N)时间O(1)内存)即可:

// The following block might slightly improve the execution time;
// Can be removed;
static const auto __optimize__ = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();

// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>

static const struct Solution {
    static const int findNumbers(
        std::vector<int>& nums
    ) {
        std::size_t count = 0;

        for (std::size_t index = 0; index < std::size(nums); ++index) {
            const auto& num = nums[index];

            if (
                (9 < num && num < 100) ||
                (999 < num && num < 10000) ||
                (num == 100000)
            ) {
                count++;
            }
        }

        return count;
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。