我对以下用例的适配器特别感兴趣:
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),那就太好了。
答案 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;});
}