C++迭代器使用疑问:计算vector首尾元素和为何需两次自减dec_pointer
问题分析与解决
核心问题说明
你的代码能出正确结果完全是巧合,本质存在三个严重问题:
- 偏移计算逻辑冗余且脆弱
每次循环it会自动向后移动1位,要匹配对应的尾部元素,偏移量每次需要减少2。你分别在求和表达式和循环末尾各做一次dec_pointer--刚好凑出了减2的效果,属于歪打正着,一旦修改逻辑漏了任何一次自减,结果就会全部错误。 - 存在迭代器越界风险
你的for循环终止条件是it != vec.cend(),会循环执行和vector长度相同的次数,当循环次数超过vector长度的1/2后,it + dec_pointer就会超出vector的有效访问范围,触发C++未定义行为,你现在没有崩溃只是测试用例巧合。 - 变量类型不匹配
first_last用来存储int类型元素的和,定义为无符号类型size_t完全不合理,如果vector中存在负数元素,计算结果会完全错误。
推荐实现方案
用双迭代器写法最直观,不需要计算复杂偏移,也能避免越界问题:
#include <iostream> #include <vector> int main() { std::vector<int> vec{1,4,2,6,9,10,17,13,15}; if (vec.empty()) { return 0; } auto left = vec.cbegin(); auto right = vec.cend() - 1; // 左右迭代器相遇即停止,不会越界 while (left <= right) { int sum = *left + *right; std::cout << "Add First and Last Digit : " << sum << std::endl; ++left; --right; } return 0; }
内容的提问来源于stack exchange,提问作者Damo
相关产品推荐
相关产品推荐

