C++ 如何在 std::vector 中插入一个连续的间隔范围?
C++ How to insert a consecutive inter range into std::vector?
假设我希望从 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
相关文章:
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用连续分隔符和空最后一个字符进行拆分
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 在 Cython 中创建一个连续数组并将其传递给C++
- C++ 如何在 std::vector 中插入一个连续的间隔范围?
- 给定n个数字,编写一个例程,以在4个连续数字之间找到最大的数字
- 您可以为连续术语编写一个概念吗?
- 从一个字符串中获取 2-5 个连续的单词短语,我得到了 2 个工作,但在做 3 个时遇到麻烦
- 如何在c++中创建一个连续的2d数组
- 查找最大和连续子数组-另一个版本
- 为什么两个连续的转换会改变一个整数
- 将连续字节作为一个整数读取
- 用C++编写一个程序,模拟反复抛硬币,并持续到连续抛出三个头
- 在一个排序的列表中正好找到N个连续项
- 将多维C++数组作为一个连续块(堆上)访问是否有效
- 如何在 C 系统 / popen 命令中通过另一个C++程序连续输入
- 在 OpenGL 中创建一个围绕其 y 轴连续旋转的三角形
- 获取下一个非连续的二进制数
- 是否有一个 c++ 矩阵库,我可以在其中索引具有非连续向量的矩阵,如 R 中的矩阵
- 如何为快速IPC分配一个连续的物理RAM