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

标签 c++ constructor constants generator c++17

为了避免可变的容器/状态,我目前想知道什么是最接近从某些输入构建 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::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++]);
});

你现在可以做的是将该代码封装在一个函数/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));
    

    Demo

  • range-v3 ,你可以这样做:

     const std::vector<std::string> output = input
         | ranges::view::transform([](int e){ return std::to_string(e); });
    

    Demo

关于c++ - 如何在现代 C++ 中使用生成器初始化 const 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925928/

相关文章:

c++ - 为什么 getline() 不读取文本文件中的所有内容?

c++ - 为什么我的 switch 语句不能在我的 C++ 程序中正确输出星号?

c++ - 这行代码在 C++ 类中是什么意思?

c++ - 使用引用修改 const 对象

c++ - 为什么**不**将函数声明为 `constexpr` ?

c++ - 隐藏窗口的PrintWindow和BitBlt

c++ - 哈希函数为一对long long?

C++:使用非默认构造函数动态分配结构成员数组

c++ - C++ 中类的复制构造函数

c++ - 如何让编译器更喜欢 C++ 中的 const 方法重载?