是否有C++ STL函数可处理相邻元素i与i+1?
用STL算法替代相邻元素遍历循环
当然可以用STL算法替代这段代码,不仅能提升可读性,还能规避原代码里的潜在边界问题。
原代码的核心逻辑是:遍历容器中的每一对相邻元素(第i个与第i+1个),调用doSomething函数。下面是不同C++版本下的STL实现方案:
C++11及以上版本
结合std::for_each和迭代器实现,无需手动维护索引:
#include <algorithm> // 先判断容器非空,避免空容器时的迭代器操作错误 if (!listOfItems.empty()) { auto prev_it = listOfItems.begin(); std::for_each(std::next(prev_it), listOfItems.end(), [&](int current_val) { doSomething(*prev_it, current_val); ++prev_it; }); }
C++20及以上版本
利用C++20范围库的std::views::adjacent,直接生成相邻元素对,代码更简洁直观:
#include <ranges> #include <algorithm> std::ranges::for_each(std::views::adjacent<2>(listOfItems), [](const auto& elem_pair) { doSomething(elem_pair.first, elem_pair.second); });
这些方案的优势
- 可读性更强:代码直接表达“处理相邻元素对”的意图,无需读者解析索引逻辑
- 安全性更高:原代码在容器为空时,
listOfItems.size()-1会因无符号整数溢出变为极大值,导致循环越界;STL方案要么提前判断空容器,要么范围视图自动处理空容器场景,避免错误 - 更符合STL范式:使用迭代器/范围的标准写法,减少手动索引的冗余代码
内容的提问来源于stack exchange,提问作者Gurushant
相关产品推荐
相关产品推荐

