C++ 如何在 std::vector 中插入一个连续的间隔范围?

C++ How to insert a consecutive inter range into std::vector?

本文关键字:连续 一个 范围 std vector C++ 插入      更新时间:2023-10-16

假设我希望从 23 到 57 的所有数字都在vector中。我可以这样做:

vector<int> result;
for (int i = 23; i <= 57; ++i)
{
result.push_back(i);
}

但对于简单的工作来说,这是一个 5 线解决方案。我不能做得更优雅吗?例如,最好的语法是vector<int> result{23 .. 57};或如此微不足道的一行代码。C++17有什么选择吗?

您可以使用std::iota(自C++11起)。

用按顺序递增的值填充范围 [第一个、最后一个),从value开始并重复计算++value

该函数以编程语言 APL 中的整数函数 ⍳ 命名。

例如

std::vector<int> result(57 - 23 + 1);
std::iota(result.begin(), result.end(), 23);

使用 range-v3,它将是:

const std::vector<int> result = ranges::view::ints(23, 58); // upper bound is exclusive

对于C++20,std::ranges::iota_view

const auto result1 = std::ranges::views::iota(23, 58); // upper bound is exclusive
const auto result2 = std::ranges::iota_view(23, 58); // upper bound is exclusive

另一种可能性是使用boost::counting_iterator[1]。这也具有与 C++98 一起使用的优势,如果您不幸被困住它。

#include <boost/iterator/counting_iterator.hpp>

result.insert(result.end(), boost::counting_iterator<int>(23), boost::counting_iterator<int>(58));

或者,更简单:

vector<int> result(boost::counting_iterator<int>(23), boost::counting_iterator<int>(58));

请注意,由于在任何一种情况下都预期为正常的半开范围,因此您都必须使用lastNum+1,并且由于这个原因,您将无法插入numeric_limits<int>::max()(又名INT_MAX)。

[1] https://www.boost.org/doc/libs/1_67_0/libs/iterator/doc/counting_iterator.html