我经常发现自己的代码看起来像这样:
bool isFirst = true;
for(const auto &item: items)
{
if(!isFirst)
{
// do something
}
// Normal processing
isFirst = false;
}
Run Code Online (Sandbox Code Playgroud)
似乎应该有更好的方式来表达这一点,因为它是功能中的一种常见模式,就像"加入"一样.
您无法知道在基于循环的范围内访问哪个元素,除非您循环遍历容器,例如,array或者vector您可以获取对象的地址并将其与第一个项目的地址进行比较以确定其中的位置你是容器.如果容器按值提供查找,您也可以执行此操作,您可以查看从find操作返回的迭代器是否与迭代器相同begin.
如果您需要对第一个元素进行特殊处理,那么您可以回退到传统的for循环
for (auto it = std::begin(items), first = it, end = std::end(items); it != end; ++it)
{
if (it == first)
{
// do something
}
// Normal processing
}
Run Code Online (Sandbox Code Playgroud)
如果您需要做的事情可以在循环中被考虑因素,那么您可以使用基于范围的for循环并将处理放在循环之前
// do something
for(const auto &item: items)
{
// Normal processing
}
Run Code Online (Sandbox Code Playgroud)
也许for_first_then_each您正在寻找a?它使用迭代器来表示范围,并将第一个函数应用于第一个元素,第二个函数应用于其余元素。
#include <iostream>
#include <vector>
template<typename BeginIt, typename EndIt, typename FirstFun, typename OthersFun>
void for_first_then_each(BeginIt begin, EndIt end, FirstFun firstFun, OthersFun othersFun) {
if(begin == end) return;
firstFun(*begin);
for(auto it = std::next(begin); it != end; ++it) {
othersFun(*it);
};
}
int main() {
std::vector<int> v = {0, 1, 2, 3};
for_first_then_each(v.begin(), v.end(),
[](auto first) { std::cout << first + 42 << '\n'; },
[](auto other) { std::cout << other - 42 << '\n'; }
);
// Outputs 42, -41, -40, -39
return 0;
}
Run Code Online (Sandbox Code Playgroud)
随着 C++20 中出现范围,您可以将其分为两个循环:
for (auto const& item : items | view::take(1)) {
// first element only (or never executed if items is empty)
}
for (auto const& item : items | view::drop(1)) {
// all after the first (or never executed if items has 1 item or fewer)
}
Run Code Online (Sandbox Code Playgroud)
如果您不想等待 C++20,请查看支持这两种操作的range-v3 。
items对于输入范围(就像 if确实是一个从 读取的范围) ,这不会像这样工作cin,但对于任何向前或更好的范围都可以正常工作(我猜items这里是一个容器,所以应该没问题)。
更直接的版本实际上是使用enumerate(仅存在于 range-v3 中,不存在于 C++20 中):
for (auto const& [idx, item] : view::enumerate(items)) {
if (idx == 0) {
// first element only
}
// all elements
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2381 次 |
| 最近记录: |