如何将N个整数读入向量?
How to read N integers into a vector?
如果我想从标准输入读取所有整数到向量,我可以使用方便的:
vector<int> v{istream_iterator<int>(cin), istream_iterator()};
但是,假设我只想读取n
整数。手动键入的循环是我得到的一切吗?
vector<int> v(n);
for(vector<int>::size_type i = 0; i < n; i++)
cin >> v[i];
还是有没有更右手的方法可以做到这一点?
通常不应该使用std::copy_n
执行此操作,它假设提供的迭代器在递增n次时仍然有效:
将
count
值从first
开始的范围精确复制到从result
开始的范围。形式上,对于每个非负整数i < n
,执行*(result + i) = *(first + i)
。(cppreference.com 关于
std::copy_n
的文章)
如果你能保证这一点,那就好了,但一般来说,std::cin
这是不可能的。你可以很容易地让它取消引用一个无效的迭代器:
默认构造的
std::istream_iterator
称为流结束迭代器。当有效std::istream_iterator
到达基础流的末尾时,它将等于流结束迭代器。取消引用或递增它会进一步调用未定义的行为。(cppreference.com 关于
std::istream_iterator
的文章)
你的循环几乎在那里,尽管我可能会使用更强的终止条件来避免从"死"流中读取过多:
vector<int> v(n);
for(vector<int>::size_type i = 0; i < n; i++)
if (!cin >> v[i])
break;
我实际上很想把它包装成类似std::copy_n
的东西,但接受一个完整的"范围",除了从0到N计数之外,还可以验证其边界。
实现可能如下所示:
template<class InputIt, class Size, class OutputIt>
OutputIt copy_atmost_n(InputIt first, InputIt last, Size count, OutputIt result)
{
for (Size i = 0; i < count && first != last; ++i)
*result++ = *first++;
return result;
}
你可以像这样使用它:
copy_atmost_n(
std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
N,
std::back_inserter(v)
);
现在你得到 M 个元素,其中M是提供的输入数或N,以较小者为准。
(现场演示)
如注释中所述,copy_n
对于这项工作来说是不安全的,但您可以将copy_if
与可变的 lambda 一起使用:
#include <iterator>
#include <vector>
#include <iostream>
#include <algorithm>
int main(){
const int N = 10;
std::vector<int> v;
//optionally v.reserve(N);
std::copy_if(
std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(v),
[count=N] (int) mutable {
return count && count--;
});
return 0;
}
正如这个答案所指出的: std::复制n个元素或到最后
相关文章:
- C++:如何循环通过向量中的整数元素
- 添加存储在向量中的大整数的函数出现问题
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- C++ 如何比较n个排序的整数向量以找到互元素?
- 必须首先打印向量 v1 中最接近整数 x 的数字<int>
- 如何将整数字符串转换为整数的二维向量?
- 如何将整数向量值插入字符向量
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 查找多个向量之间的公共元素(无整数元素)
- 如何将整数向量插入到键中,标准::映射的值
- 整数对的向量转化为整数向量的向量
- 如何组合两个整数向量
- C++中整数向量的序列化/反序列化
- 如何从C++中的值向量构造整数<bool>值
- 使用整数初始化列表初始化长双精度的向量
- 将向量整数拆分为这些数字的整数
- 如何访问映射的向量(整数和字符串的向量)
- 将带有时间戳的向量整数连接为C++中的字符串