如何在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的优势。
- 去LeetCode找一些数组、哈希表、字符串相关的题目,刻意用STL容器和算法来实现,比如用
内容的提问来源于stack exchange,提问作者DEEPANK KUMAR
相关产品推荐
相关产品推荐

