首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在现代C++中用生成器初始化容器?

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

Stack Overflow用户
提问于 2018-06-19 02:16:36
回答 2查看 498关注 0票数 6

为了避免可变的容器/状态,我目前想知道从某些输入构建const STL容器最接近的事情是什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const vector<int> input = {2, 13, 7, 1};

我想做的是这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const auto transformed = generate_from<vector<string>>(
    input.begin(), input.end(), to_string);

do_something(transformed);

虽然您发现的方法最多是创建一个可变对象并对其进行修改(我希望避免):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,但它们操作的对象是可变的,因此它们不能解决我的问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中,它为您提供了一致性,但也提供了嘈杂的样板代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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找到一些构造函数,我可以这样使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const auto transformed = vector<string>(input.size(), [&input, n=0] () mutable {
    return to_string(input[n++]);
});

什么是当今最现代的C++ish方法,为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-19 02:38:03

  • 使用boost::transform_iterator,您可以这样做: auto to_string_fun = 康斯特汽车&E{返回std::to_string(e);};const std::vector std::to_string to_string_fun),boost::transform_iterator(input.end(),to_string_fun); 演示
  • 使用范围-v3,您可以这样做: const std::vector output = input input::view::transform(int e{返回std::to_string(e);}); 演示
票数 11
EN

Stack Overflow用户

发布于 2018-06-19 07:04:51

借助Jarod42的回答,我找到了boost::copy_rangeboost::adaptors::transformed,它们可以像范围-v3一样使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const auto transformed = boost::copy_range<vector<string>>(
        input |
        boost::adaptors::transformed([] (const auto &elem) { 
            return to_string(elem);}));

由于我已经在使用Boost,所以我将使用这个解决方案,否则我肯定会使用range-v3,直到它成为标准:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50925928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文