为了避免可变的容器/状态,我目前想知道什么是最接近从某些输入构建 const
STL 容器的东西,例如
const vector<int> input = {2, 13, 7, 1};
我想做的是这样的:
const auto transformed = generate_from<vector<string>>(
input.begin(), input.end(), to_string);
do_something(transformed);
虽然您发现最多的方法是创建一个可变对象并对其进行修改(我想避免这种情况):
vector<string> bad_mutable_container;
for (const auto & elem : input) {
bad_mutable_container.push_back(to_string(input[elem]));
};
do_something(bad_mutable_container);
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++]);
});
你现在可以做的是将该代码封装在一个函数/lambda 中,它为你提供了常量性但也有嘈杂的样板代码:
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);
我希望至少找到一些构造函数,例如std::vector
我可以这样使用:
const auto transformed = vector<string>(input.size(), [&input, n=0] () mutable {
return to_string(input[n++]);
});
当今最现代的 C++ 式方法是什么?为什么?
最佳答案
使用
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));
与 range-v3 ,你可以这样做:
const std::vector<std::string> output = input | ranges::view::transform([](int e){ return std::to_string(e); });
关于c++ - 如何在现代 C++ 中使用生成器初始化 const 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925928/