【问题标题】:c++ runtime error when using vectors push back and iterator使用向量推回和迭代器时的c ++运行时错误
【发布时间】:2019-03-04 02:47:59
【问题描述】:

您好,我正在尝试解决算法问题,当我向在线法官提交代码时,我不断收到运行时错误。我不知道为什么会这样。 这是我要解决的问题。

代码如下。它适用于 Visual Studio 中的示例输入和输出。我还没有遇到不能正常工作或实际遇到运行时错误的输入和输出。只有在线法官给出了运行时错误,所以我不知道为什么。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    int m;
    int c1;
    int c2;
    cin >> n >> m >> c1 >> c2;
    vector<int> p = {};
    vector<int> q = {};
    for (int i = 0; i < n; ++i)
    {
        int temp;
        cin >> temp;
        p.push_back(temp);
    }
    for (int i = 0; i < m; ++i)
    {
        int temp;
        cin >> temp;
        q.push_back(temp);
    }
    vector<int> distance = {};
    for (int i = 0; i < p.size(); ++i)
    {
        for (int j = 0; j < q.size(); ++j)
        {
            distance.push_back(abs(p[i] - q[j]) + abs(c1 - c2));
        }
    }
    sort(distance.begin(), distance.end());
    int min = distance[0];
    int count = 0;;
    for (int i = 0; i < static_cast<int>(distance.size()); ++i)
    {
        if (distance[0] == distance[i])
            count++;
        else
            break;
    }
    cout << min << " " << count << endl;
    return 0;
}

【问题讨论】:

  • 你考虑过distance向量的大小可以为0吗?
  • m和n都等于或大于1,所以距离的大小不能为0
  • @BoBTFish 我已经编辑了问题,您现在可以检查问题。
  • @SeJinKim ijmncount 的类型应为 std::size_t
  • 如果n和m都是500,000那么距离使用了1TB的内存,想必在线判断不允许分配这个内存量。如果你再考虑一下这个问题,你不需要记录所有距离的值

标签: c++ vector runtime


【解决方案1】:

如果nm 都是500,000 的最大允许值,那么距离将包含500,000 * 500,000 元素,这些元素将使用1TB 内存。由于矢量随着您push_back 而增长,您实际上总共可能需要大约 2TB 的内存。网上的法官大概不允许你使用这么多内存。

如果您重新考虑您的算法以不存储距离值,它可能会起作用。

如果您事先知道大小,则应该始终在 std::vector 上使用 reserve,因为它应该会导致向量分配准确的内存量,并避免随着向量的增长复制到新的内存块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多