C++中vector相邻元素比较时i+1越界的处理方案咨询
解决Vector相邻元素比较的边界越界问题
这个问题在处理容器元素相邻比较时特别常见,核心思路就是绝对不访问超出容器范围的元素,给你几个实用的解决方式:
1. 直接调整循环终止条件(最常用)
既然要比较第i个和第i+1个元素,那循环只需要运行到倒数第二个元素就停下。举个C++的例子:
#include <vector> #include <string> #include <iostream> int main() { std::vector<std::string> words = {"apple", "banana", "banana", "cherry"}; // 关键:循环到 size()-1 就停止,i+1 最多是最后一个元素 for (size_t i = 0; i < words.size() - 1; ++i) { if (words[i] == words[i+1]) { // 处理相邻重复的逻辑,比如打印提示 std::cout << "找到相邻重复单词:" << words[i] << std::endl; } } return 0; }
这里要注意用size_t定义循环变量i,因为vector.size()返回的是无符号整数,避免出现负数比较的奇怪问题。
2. 用迭代器遍历(更符合STL风格)
如果习惯用STL的迭代器,这种写法天然能规避越界问题:
#include <vector> #include <string> #include <iterator> #include <iostream> int main() { std::vector<std::string> words = {"apple", "banana", "banana", "cherry"}; for (auto it = words.begin(); it != words.end(); ++it) { auto next_it = std::next(it); if (next_it == words.end()) { break; // 已经到最后一个元素,没有下一个可比较 } if (*it == *next_it) { std::cout << "找到相邻重复单词:" << *it << std::endl; } } return 0; }
或者更简洁一点,直接把终止条件设为it != words.end() - 1,效果是一样的。
3. 提前判断容器大小
如果vector里的元素少于2个,那根本没有相邻元素可比较,直接跳过整个比较逻辑就行:
if (words.size() < 2) { // 没有相邻元素,直接返回或做其他处理 return 0; } // 之后再执行循环比较逻辑
总的来说,第一种方法是最直接高效的,只要保证循环不会跑到最后一个元素,i+1就永远不会超出vector的边界。
内容的提问来源于stack exchange,提问作者Mrr TaQi
相关产品推荐
相关产品推荐

