首页 > 解决方案 > 是否可以比较实现为 for(int a : vec) 的向量循环中的两个元素

问题描述

我确实有一个问题。我想做一个向量元素的比较。如果我用旧式写

for(int i = 0; i < vec.size()-1; i++){
if(vec[i] < vec[i+1])
...
}

但是新的风格我看不懂,怎么能一样呢

for(auto a : vect)

有没有办法做和上面一样的工作?谢谢

标签: c++

解决方案


正确的风格是为手头的任务使用适当的算法。仅当您想要执行一个

for (auto const & i : v) // std::for_each

或一个

for (auto & i : v) // std::transform

在这种情况下,如果要比较相邻元素,则应使用其中一种std::adjacent...算法。

如果您只想根据比较相邻元素的谓词在向量中找到一个位置,请使用

std::adjacent_find(std::begin(v), std::end(v));

如果要根据使用相邻元素的谓词转换范围,请使用

std::adjacent_difference(std::begin(v), std::end(v), std::begin(v));

只有在没有合适的算法可以使用时才应该使用传统的 for 循环(这种情况很少发生)。

附带说明一下,如果输入范围为空,则传统的 for 循环具有 UB。用-Wall编译器会指出有问题的代码。更喜欢这样写

for(int i = 0; i < static_cast<int>(vec.size()) - 1; ++i){
  if(vec[i] < vec[i+1])
  // ...
}

或者像这样,如果你想避免铸造

for(auto i = 0u; i + 1 < vec.size(); ++i){
  if(vec[i] < vec[i+1])
  // ...
}

推荐阅读