c++ - 是否可以比较实现为 for(int a : vec) 的向量循环中的两个元素
问题描述
我确实有一个问题。我想做一个向量元素的比较。如果我用旧式写
for(int i = 0; i < vec.size()-1; i++){
if(vec[i] < vec[i+1])
...
}
但是新的风格我看不懂,怎么能一样呢
for(auto a : vect)
有没有办法做和上面一样的工作?谢谢
解决方案
正确的风格是为手头的任务使用适当的算法。仅当您想要执行一个
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])
// ...
}
推荐阅读
- swift - 如何根据单元格大小设置集合视图高度?
- oracle - 根据顺序将多个 oracle 表分组到一个表中
- excel - 在 VBA for Excel 中,为什么在复制和粘贴来自另一个工作表的信息时使用 activecell 和 activesheet?
- laravel - 双链接 laravel 表
- matplotlib - Seaborn 信息重叠轴
- python - 使用python登录wifi
- c - 如何在 Windows 上以编程方式执行 ping 测试?
- python-3.x - Astropy:删除包含 nan 的行
- python - Treeview 元组排序为字符串(错误顺序)
- python-2.7 - AttributeError:“请求”对象没有属性“is_xhr”