【问题标题】:Initializing std::vector with ranges library使用范围库初始化 std::vector
【发布时间】:2020-05-16 18:08:37
【问题描述】:

我想用一系列连续整数初始化std::vector,而不用输入所有整数,比如第二行,无法编译,在这段代码 sn-p 中:

  std::vector<int> a{0, 1, 2, 3, 4, 5};
  std::vector<int> b{std::ranges::iota_view(0, 5)};  // ERROR!

当然,我更喜欢:

  std::vector<int> b{0:5};

但这在 C++41 标准之前没有安排。任何想法如何在 C++20 中做到这一点?

【问题讨论】:

  • 您是否有任何特定限制会阻止将它们设置在循环中?在编译时要求它没有多大意义,因为存储空间不存在。
  • 'std::vector b(5); 有什么问题? std::iota(b.begin(), b.end(), 0)'?
  • @Cortex:因为它首先对数组进行值初始化。
  • @KennyOstrom 我喜欢简洁的符号,并且尽可能避免使用命令式代码。
  • 迭代器构造函数怎么样? auto v = std::views::iota(0, 5); auto b = std::vector(v.begin(), v.end());

标签: c++ c++20


【解决方案1】:

你要找的是

auto b=std::ranges::to<std::vector>(std::ranges::iota_view(0, 5));

不幸的是,proposal 错过了 C++20,仅仅是因为没有时间审查其措辞(在添加了您尝试过的构造函数的先前版本发现不可行之后)。希望它会在 C++23 周期的早期被合并并实现。

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 2017-04-17
    • 2017-04-04
    • 2020-05-14
    • 2013-07-13
    • 2012-06-09
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多