在迭代器上是否有STL适配器调用每个集合元素的回调

Is there an STL adaptor on iterator invoking callback for each collection element?

本文关键字:集合 元素 回调 调用 适配器 迭代器 是否 STL      更新时间:2023-10-16

我对以下用例的适配器特别感兴趣:

std::list<int> input {1, 2, 3};
std::list<int> result;
auto l = [](auto e) { return e + 1; };
result.insert(result.end(), adaptor(input.begin(), l), adaptor(input.end(), l));
// now result == {2, 3, 4}

如果适配器不使用外部库(例如boost)就好了。

你的问题被标记为c++ 14,并说没有外部库依赖会很好(足够公平)。

但是,为了将来的参考,请注意range库似乎正在被标准库采用(c++ 17范围For循环已经符合其主要的一点)。因此,使用range,代码看起来像这样:
#include <list>
#include <range/v3/all.hpp>
int main() {
    const std::list<int> input{1, 2, 3};
    const std::list<int> result = 
        input | ranges::view::transform([](int i){ return i + 1; });
}

,这是未来的标准库c++代码可能是什么。无论如何,它有它的优点:

  • 它看起来更直观(尽管这可能是主观的)。

  • 注意如何使result变为const

所以使用PiotrSkotnicki建议,我最终得到这样的代码:

#include <algorithm>
#include <iterator>
#include <list>
int main() {
   std::list<int> input {1, 2, 3};
   std::list<int> output;
   std::transform(input.begin(), input.end(), std::back_inserter(output), [](auto e){ return e + 1;});
}