我建议您避免使用原始循环,而是使用标准库来执行此操作。为了完成它,其中有几个结构:
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
int main() {
std::vector<int> arr;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
back_inserter(arr));
for(int i : arr)
std::cout << i << ' ';
}
Live Example
std::istream_iterator 旨在以您需要的确切形式处理输入(以空格分隔的行)。它还将更稳健地检测流的结尾。
istream_iterator 创建的虚拟“输入范围”随后被馈送到std::copy 算法。这很明显,并将范围内的每个元素分配给 std::back_inserter 返回的迭代器。这个赋值本质上只是一个调用arr.push_back的包装器。
如果你真的只想复制到一个点,标准库没有copy_until 算法。但是推出我们自己的并不难:
#include <iterator>
#include <vector>
#include <iostream>
template<typename InputIt, typename ForwardIt, typename UnaryPred>
void copy_until(InputIt start, InputIt end, ForwardIt d_first, UnaryPred p) {
while(start != end && p(*start))
*d_first++ = *start++;
}
int main() {
std::vector<int> arr;
int count = 0;
copy_until(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
back_inserter(arr), [&](int) {
return ++count < 3;
});
for(int i : arr)
std::cout << i << ' ';
}
Live Example