You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++ vector中查找最大值及其索引?段错误排查与STL资源求荐

段错误排查与修复

嘿,我来帮你搞定这个段错误问题!先看代码里的核心问题:

你的循环条件是while(W1<=w),但没考虑vector被清空的情况。当values和weights被erase到空的时候,max_element(values.begin(), values.end())会返回values.end()——这是一个尾后迭代器,解引用它(也就是*max_element(...))是完全非法的,直接导致段错误。

另外还有一个逻辑漏洞:当你处理完“剩余空间装不下整个物品”的情况(else分支),应该直接跳出循环,否则会继续执行erase,然后再次进入循环,这时候哪怕W1已经等于w了,还是会触发后续的非法操作。

下面是修复后的代码:

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

double bag(int w, vector<int> values, vector<int> weights) {
    int index;
    double W1 = 0.0;
    double V = 0.0;
    // 新增vector非空的判断,避免空容器调用max_element
    while (W1 <= w && !values.empty()) {
        int ma = *max_element(values.begin(), values.end());
        auto it = find(values.begin(), values.end(), ma);
        index = distance(values.begin(), it);
        
        if (w - W1 >= weights[index]) {
            V += values[index];
            W1 += weights[index];
        } else {
            V += values[index] * (w - W1) / static_cast<double>(weights[index]);
            // 装完剩余空间后直接跳出循环,避免无效迭代
            break;
        }
        values.erase(it);
        weights.erase(it);
    }
    return V;
}

int main() {
    int n; 
    int w; 
    double ans;
    std::cin >> n >> w;
    vector<int> values(n);
    vector<int> weights(n);
    
    for (int i = 0; i < n; i++) {
        std::cin >> values[i] >> weights[i];
    }
    
    // 可以保留这个测试输出,不过注意如果n=0会越界,题目里n应该是正整数
    // cout << values[n-1]; 
    ans = bag(w, values, weights);
    cout << ans << endl;
    return 0;
}

额外提一句:values[index]*(w-W1)/weights[index]这里要注意整数除法的问题,我加了static_cast<double>把weights[index]转成double,避免结果被截断。

STL学习资源推荐

既然你有C++基础但STL学起来吃力,推荐这些资源:

  • 书籍类:
    • 《C++ Primer(第五版)》:里面的STL章节从容器、迭代器到算法都讲得非常细致,适合打基础,把每个容器的特性、常用操作搞明白。
    • 《Effective STL》:专门针对STL的常见误区和最佳实践,比如什么时候用vector还是list,怎么正确使用迭代器,能帮你避开很多像这次一样的坑。
    • 《C++标准库(Nicolai M. Josuttis著)》:这是STL的权威参考书籍,内容全面,适合当手册查,遇到某个算法或容器的细节问题时翻一翻。
  • 文档类:
    • cppreference:这是C++开发者常用的标准库参考文档,每个容器、算法都有详细的用法说明、示例代码和注意事项,能帮你快速理清函数的参数、返回值和使用限制。
  • 练习类:
    • 去LeetCode找一些数组、哈希表、字符串相关的题目,刻意用STL容器和算法来实现,比如用sort、find、accumulate这些函数替代自己写循环,边练边巩固。
    • 写一些小项目,比如用map统计文本里的单词频率,用vector和algorithm实现排序、查找功能,在实践中理解STL的优势。

内容的提问来源于stack exchange,提问作者DEEPANK KUMAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:07:48