如何在现代C++中使用生成器初始化const容器?

fra*_*ans 6 c++ constructor const generator c++17

为了避免可变容器/状态,我当前想知道const从某些输入构造STL容器最接近的是什么,例如

const vector<int> input = {2, 13, 7, 1};
Run Code Online (Sandbox Code Playgroud)

我想做的是这样的事情:

const auto transformed = generate_from<vector<string>>(
    input.begin(), input.end(), to_string);

do_something(transformed);
Run Code Online (Sandbox Code Playgroud)

虽然你发现最多的方法会创建一个可变对象并修改它(我想避免的):

vector<string> bad_mutable_container;
for (const auto & elem : input) {
    bad_mutable_container.push_back(to_string(input[elem]));
};

do_something(bad_mutable_container);
Run Code Online (Sandbox Code Playgroud)

C++ 11和更新提供std::generatestd::generate_n,但他们一个可变对象进行操作,所以他们不解决我的问题:

vector<string> bad_mutable_container(input.size());
generate_n(bad_mutable_container.begin(), input.size(), [&input, n=0] () mutable {
    return to_string(input[n++]);
});
Run Code Online (Sandbox Code Playgroud)

您现在可以做的是将该代码封装在函数/ lambda中,它为您提供了const-ness但也提供了嘈杂的样板代码:

const auto transformed = [&input] {
    vector<string> bad_mutable_container;
    for (const auto & elem : input) {
        bad_mutable_container.push_back(to_string(elem));
    };
    return bad_mutable_container;
} ();

do_something(transformed);
Run Code Online (Sandbox Code Playgroud)

我期望找到至少一些构造函数,例如std::vector我可以像这样使用:

const auto transformed = vector<string>(input.size(), [&input, n=0] () mutable {
    return to_string(input[n++]);
});
Run Code Online (Sandbox Code Playgroud)

今天最现代的C++方法是什么?为什么?

Jar*_*d42 10