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::generate和std::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
有boost::transform_iterator,您可以这样做:
auto to_string_fun = [](const auto& e){ return std::to_string(e); };
const std::vector output(boost::transform_iterator(input.begin(), to_string_fun),
boost::transform_iterator(input.end(), to_string_fun));
Run Code Online (Sandbox Code Playgroud)
使用range-v3,您可以:
const std::vector<std::string> output = input
| ranges::view::transform([](int e){ return std::to_string(e); });
Run Code Online (Sandbox Code Playgroud)