将大整数作为向量中的值传递时的分段错误

时间:2019-05-27 07:25:48

标签: c++ c++11 vector stl

在传递大整数时出现分段错误(Core Dumped)。它适用于较小的输入。

int替换为long int,并尝试全局声明变量,但仍然是相同的错误。此函数用于执行许多右旋旋转,并以给定索引返回元素的值。这是函数:

    vector<long long int> circularArrayRotation(vector<long long int> a, long long int k, vector<long long int> queries) {
        vector <long long int> b;
        std::vector<long long int> result(queries.size());

        b=a;
        for(long long int j=0;j<k;j++)
        {
            for(long long int i=0;i<a.size();i++)
                a[i]=b[(a.size()+i-1)%a.size()];
            b=a;
        }

        for(long long int k=0;k<queries.size();k++)
            result[k]=a[queries[k]];
        for(long long int i=0;i<result.size();i++)
                cout<<result[i]<<endl;

        return result;

    }

其余代码可在此处link

中找到

3 个答案:

答案 0 :(得分:0)

vector由一个连续的内存数组作为后盾,您的计算机无法分配这么大的数组。

您可以考虑改用list,但是如果您关心性能,可能需要重写代码以使用迭代器。

答案 1 :(得分:0)

抛开实现的质量(无需复制任何副本即可旋转矢量,可以就地完成),最有可能导致segfault的错误出现在未显示的代码中。

要进一步调试,请使用以下链接:

如果您需要进一步的帮助,请发布整个代码。

==编辑==

您的代码不是触发段错误,而是HackerRank上的“由于超时而终止”错误。换句话说,您的解决方案太慢了。

那是因为不需要旋转任何东西来解决Circular Array Rotation

vector<int> circularArrayRotation(vector<int> a, int k, vector<int> queries) {
    vector<int> res;
    res.reserve(queries.size());
    int offset = k % a.size() - a.size();
    for (int i : queries) {
        res.push_back(a[(i - offset) % a.size()]);
    }
    return res;
}

即只需在选择请求的元素时考虑轮换即可。

答案 2 :(得分:0)

问题可能出在查询[k]> a.size() result[k]=a[queries[k]]; 由于我们不知道实际输入,因此很难找出原因。