迭代器上是否有一个STL适配器为每个集合元素调用回调?

时间:2016-09-25 09:36:46

标签: c++ stl c++14

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

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),那就太好了。

2 个答案:

答案 0 :(得分:4)

您的问题标记为C ++ 14,并且表示没有外部库依赖会很好(足够公平)。

为了将来参考,请注意range库似乎正在通过标准库(C++17 range for loop is already compliant with one of its major points)采用。因此,使用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

答案 1 :(得分:2)

因此,使用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;});
}