鱼C论坛

 找回密码
 立即注册
查看: 966|回复: 6

这个代码为什么vector爆了

[复制链接]
发表于 2023-12-2 15:12:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[mid] > score)
                {
                        right = mid - 1;
                }
                else if (school[mid] < score)
                {
                        left = mid + 1;
                }
                else
                {
                        return 0;
                }
        }
        if (abs(school[left] - score) > abs(school[right] - score))
        {
                return abs(school[right] - score);
        }
        else
        {
                return abs(school[left] - 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[i]);
        }
        cout << res;
        return 0;
}
为什么vector爆了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

错误4:
在`main`函数中,`cha`函数的调用应该传递`stu[i ]`,而不仅仅是`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[mid] > score) {
            right = mid - 1;
        } else if (school[mid] < score) {
            left = mid + 1;
        } else {
            return 0;  // 如果找到了完全相同的分数,差值就是0
        }
    }
    // 检查最接近的分数并返回差值
    int diff = INT_MAX;
    if (left < m)
        diff = min(diff, abs(school[left] - score));
    if (right >= 0)
        diff = min(diff, abs(school[right] - 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[i]);  // 修改了这里的参数传递
    }
    cout << res << endl;  // 添加了输出
    return 0;
}

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

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

bug修复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-2 15:15:04 | 显示全部楼层


我会根据错误指出的地方一一修复代码的问题。修复后的代码如下:
#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[mid] - score)); // 更新最小差值

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

    // 循环结束后,比较边界的值,找出最接近的
    if (left < m) {
        diff = min(diff, abs(school[left] - score));
    }
    if (right >= 0) {
        diff = min(diff, abs(school[right] - 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[i]而非stu访问学生分数
        res += cha(stu[i]);
    }

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

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-2 15:21:14 | 显示全部楼层
FishC_GPT 发表于 2023-12-2 15:15
我会根据错误指出的地方一一修复代码的问题。修复后的代码如下:

你重新回答一下我的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-2 15:21:53 | 显示全部楼层
黎子卿 发表于 2023-12-02 15:21
你重新回答一下我的问题


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

1. `#include` 后面应该跟具体的头文件名称。
2. 在`cha`函数中,二分查找的实现有问题,它没有正确处理当`score`值不在`school`中时的边界情况。
3. 在`cha`函数中,应该使用`school[mid]`而不是`school`。
4. 在`cha`函数的最后,忘记了比较分数与边界学校之间的差异。
5. 在`main`函数中,调用`cha(stu[i ])`时,应该传递`stu[i ]`,而不是`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[mid] > score) {
            right = mid - 1;
        } else if (school[mid] < score) {
            left = mid + 1;
        } else {
            return 0; // 分数完全匹配,差值为0
        }
    }

    // 检查左右边界的差值
    int leftDiff = (left < m) ? abs(school[left] - score) : INT_MAX;
    int rightDiff = (right >= 0) ? abs(school[right] - 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[i] = x;
        res += cha(stu[i]); // 传递stu[i]而非stu
    }

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

    return 0;
}

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-2 18:28:20 | 显示全部楼层
你的代码实现了二分查找来寻找一个学生分数最近的学校分数,并计算出总的差值。

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

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

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

解决方法:

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

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

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


有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 08:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表