黎子卿 发表于 2023-12-2 15:12:04

这个代码为什么vector爆了

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int m, n;
vector<int> school;
int cha(int score)
{
        int left = 0;
        int right = m - 1;
        int mid = left + (right - left) / 2;
        while (left <= right)
        {
                mid = left + (right - left) / 2;
                if (school > score)
                {
                        right = mid - 1;
                }
                else if (school < score)
                {
                        left = mid + 1;
                }
                else
                {
                        return 0;
                }
        }
        if (abs(school - score) > abs(school - score))
        {
                return abs(school - score);
        }
        else
        {
                return abs(school - score);
        }
}
int main()
{
        cin >> m >> n;
        vector<int> stu;
        int x;
        for (int i = 0; i < m; i++)
        {
                cin >> x;
                school.push_back(x);
        }
        for (int i = 0; i < n; i++)
        {
                cin >> x;
                stu.push_back(x);
        }
        sort(school.begin(), school.end());
        int res = 0;
        for (int i = 0; i < n; i++)
        {
                res = res + cha(stu);
        }
        cout << res;
        return 0;
}
为什么vector爆了

FishC_GPT 发表于 2023-12-2 15:12:47

首先,你的代码包含几个明显的错误,包括一些语法错误和逻辑错误。我会逐一地指出这些错误,并给出修正后的代码。

错误1:
`#include` 后面需要跟上要包含的头文件名,但是你的代码里这些都是空的。

错误2:
在`cha`函数中,应该使用`school`来比较,但你的代码里用了`school`。

错误3:
在`cha`函数的最后部分,你进行了差值比较,但是和`school`相关的表达式里漏掉了``和``或``这样的访问。

错误4:
在`main`函数中,`cha`函数的调用应该传递`stu`,而不仅仅是`stu`。

错误5:
`cout`后面没有输出的内容,所以不会有任何输出。

错误6:
除了以上的一些逻辑问题,一旦修复了这些,可能会发生vector爆了的问题。因为你的`cha`函数在查找最接近的分数时,没有处理好边界情况,如果最后的`left`和`right`在退出循环时不满足`left <= right`,很可能会有访问vector越界的问题。

下面是修正后的代码:

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

int m, n;
vector<int> school;

// 查找与score最接近的学校分数,并返回差值
int cha(int score) {
    int left = 0;
    int right = m - 1;
    while (left <= right) {// 修改了这里的条件
      int mid = left + (right - left) / 2;
      if (school > score) {
            right = mid - 1;
      } else if (school < score) {
            left = mid + 1;
      } else {
            return 0;// 如果找到了完全相同的分数,差值就是0
      }
    }
    // 检查最接近的分数并返回差值
    int diff = INT_MAX;
    if (left < m)
      diff = min(diff, abs(school - score));
    if (right >= 0)
      diff = min(diff, abs(school - score));
    return diff;
}

int main() {
    cin >> m >> n;
    vector<int> stu;
    int x;
    for (int i = 0; i < m; i++) {
      cin >> x;
      school.push_back(x);
    }
    for (int i = 0; i < n; i++) {
      cin >> x;
      stu.push_back(x);
    }
    sort(school.begin(), school.end());
    int res = 0;
    for (int i = 0; i < n; i++) {
      res += cha(stu);// 修改了这里的参数传递
    }
    cout << res << endl;// 添加了输出
    return 0;
}

这样代码应该就可以正常工作了,不会出现vector爆了的问题。注意,即使是经过修正的代码,也是基于你原始代码的意图和逻辑做出的猜想。如果有其他特殊需求或逻辑,请根据实际情况进行调整。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

黎子卿 发表于 2023-12-2 15:14:38

FishC_GPT 发表于 2023-12-2 15:12
首先,你的代码包含几个明显的错误,包括一些语法错误和逻辑错误。我会逐一地指出这些错误,并给出修正后的 ...

bug修复

FishC_GPT 发表于 2023-12-2 15:15:04

黎子卿 发表于 2023-12-02 15:14
bug修复

我会根据错误指出的地方一一修复代码的问题。修复后的代码如下:

#include <iostream> // 添加正确的头文件
#include <vector>
#include <cmath> // cmath用于计算绝对值
#include <algorithm> // algorithm用于排序

using namespace std;

int m, n;
vector<int> school; // 使用正确的数据类型

// 计算分数最接近的学校并返回差值
int cha(int score){
    int left = 0;
    int right = m - 1;
    int diff = INT_MAX; // 保存最小差值

    while (left <= right){
      int mid = left + (right - left) / 2;
      diff = min(diff, abs(school - score)); // 更新最小差值

      if(school > score){
            right = mid - 1;
      } else if(school < score){
            left = mid + 1;
      } else {
            return 0; // 分数完全匹配,差值为0
      }
    }

    // 循环结束后,比较边界的值,找出最接近的
    if (left < m) {
      diff = min(diff, abs(school - score));
    }
    if (right >= 0) {
      diff = min(diff, abs(school - score));
    }
   
    return diff;
}

int main(){
    cin >> m >> n;
    vector<int> stu; // 使用正确的数据类型
    int x;
   
    for (int i = 0; i < m; i++){
      cin >> x;
      school.push_back(x);
    }
   
    for (int i = 0; i < n; i++){
      cin >> x;
      stu.push_back(x);
    }
   
    sort(school.begin(), school.end());
   
    int res = 0;
    for (int i = 0; i < n; i++){
      // 传递stu而非stu访问学生分数
      res += cha(stu);
    }

    // 正确输出结果
    cout << res << endl;
   
    return 0;
}

这段代码中的`cha`函数现在会处理所有的边界情况,且在循环结束之后会检查`left`和`right`指针的边界值,以确保找到最小的差值。同时,`main`函数中也正确地传递了`stu`给`cha`函数,而不是整个`stu`向量。最后,`cout`语句正确地输出了累加的结果。这样修改后的代码应该不会出现vector爆了的问题,并且能够正常运行计算出结果。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

黎子卿 发表于 2023-12-2 15:21:14

FishC_GPT 发表于 2023-12-2 15:15
我会根据错误指出的地方一一修复代码的问题。修复后的代码如下:



你重新回答一下我的问题

FishC_GPT 发表于 2023-12-2 15:21:53

黎子卿 发表于 2023-12-02 15:21
你重新回答一下我的问题

很抱歉之前的回复中有误,让我们重新来过。你的代码中有几个错误和一个可能导致vector访问越界的问题。让我们逐一解决这些问题:

1. `#include` 后面应该跟具体的头文件名称。
2. 在`cha`函数中,二分查找的实现有问题,它没有正确处理当`score`值不在`school`中时的边界情况。
3. 在`cha`函数中,应该使用`school`而不是`school`。
4. 在`cha`函数的最后,忘记了比较分数与边界学校之间的差异。
5. 在`main`函数中,调用`cha(stu)`时,应该传递`stu`,而不是`stu`。
6. 在`main`函数最后的`cout`语句中,缺少输出内容。

下面是修正后的完整代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int m, n;
vector<int> school;

// 计算分数最接近的学校并返回差值
int cha(int score) {
    int left = 0;
    int right = m - 1;
    int mid;
    while (left <= right) {
      mid = left + (right - left) / 2;
      if (school > score) {
            right = mid - 1;
      } else if (school < score) {
            left = mid + 1;
      } else {
            return 0; // 分数完全匹配,差值为0
      }
    }

    // 检查左右边界的差值
    int leftDiff = (left < m) ? abs(school - score) : INT_MAX;
    int rightDiff = (right >= 0) ? abs(school - score) : INT_MAX;
    return min(leftDiff, rightDiff);
}

int main() {
    cin >> m >> n;
    vector<int> stu(m);
    int x;

    for (int i = 0; i < m; i++) {
      cin >> x;
      school.push_back(x);
    }

    // 对学校的分数进行排序
    sort(school.begin(), school.end());

    int res = 0;
    for (int i = 0; i < n; i++) {
      cin >> x;
      stu = x;
      res += cha(stu); // 传递stu而非stu
    }

    // 输出结果
    cout << res << endl;

    return 0;
}

注意:代码中增加了一些注释,以便更好地理解每一部分代码的功能。在`cha`函数中,增加了两个变量`leftDiff`和`rightDiff`,这是为了处理当`score`不在`school`数组中时,和数组两侧边界值进行比较。最后,我们取这两个差值中的最小值。在`main`函数中,我修正了向`cha`函数传递参数的方式,确保传入的是每一个学生的分数,而非整个学生数组。最后,在主函数的末尾添加了`cout`语句来输出最后的结果`res`。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

sfqxx 发表于 2023-12-2 18:28:20

你的代码实现了二分查找来寻找一个学生分数最近的学校分数,并计算出总的差值。

程序出现 "vector爆了" 的错误可能有以下几种情况:

1) 越界问题。在执行二分查找过程中,需要保证 mid, left, right 都不能越界。特别是需要注意,对于程序中的 `school` 和 `school` `school`,必须确保它们的下标不会超过向量的大小。

2) 空间不足。如果输入的数据量非常大,那么可能导致 vector 无法存储所有数据。vector 在存储数据时需要连续的内存空间,如果没有足够的连续内存空间,那么 vector 就会 "爆掉"。

解决方法:

1) 检查是否存在越界的情况。在执行二分查找之前,可以添加一些边界检查。

2) 检查输入的数据量是否超过 vector 的最大容量。如果超过,那么可以考虑换用其他的数据结构,比如链表,或者是用文件进行磁盘存储。

以上都没有问题的话,有可能是编译器或者运行环境的问题。可以尝试换一个编译器或者运行环境试试看。

有用请设置最佳答案{:10_254:}
页: [1]
查看完整版本: 这个代码为什么vector爆了