使用ranges库初始化std::vector

12

我想用一系列连续的整数初始化std::vector,而不需要手动输入每一个数字。这段代码有第二行,但无法编译:

  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中实现吗?


2
@Cortex:因为它首先进行值初始化数组。 - Nicol Bolas
2
@KennyOstrom 我喜欢简洁的符号表示法,并尽可能避免使用命令式代码。 - Paul Jurczak
@PaulJurczak 嗯,std::vector有9个构造函数,但它们都不能做你想要的事情。除此之外,std::iota字面上就是为了可读性而设计的,任何看到它的程序员都会立刻知道你的向量内容。 - Cortex0101
2
迭代器构造函数怎么样?auto v = std::views::iota(0, 5); auto b = std::vector(v.begin(), v.end()); - J. Willus
1
@J.Willus 这并不保证可行:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93651 - Pilar Latiesa
显示剩余9条评论
1个回答

9
你要寻找的是:
auto b=std::ranges::to<std::vector>(std::ranges::iota_view(0, 5));

很遗憾,由于没有时间审核其措辞(在先前添加了您尝试的构造函数但被发现无法工作的版本之后),那个提案未能赶上C++20。希望在C++23周期早期将其合并和实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接