考虑以下代码:
...
int N,var;
vector<int> nums;
cin >> N;
while (N--)
{
cin >> var;
nums.push_back(var);
}
...
是否可以在不使用辅助变量的情况下执行此操作,在这种情况下var
?
答案 0 :(得分:10)
假设您已经阅读了最初的N
,那么使用istream_iterator
就有一个很好的技巧:
std::vector<int> nums;
nums.reserve(N);
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(nums));
back_inserter
对象将自身转换为迭代器,在结尾处向向量添加元素。迭代器流可以通过读取的元素类型进行参数化,如果没有给出参数,则表示输入结束。
答案 1 :(得分:4)
如果您的工具带中还没有copy_n()
,那么您应该这样做。非常有用。
template<class In, class Size, class Out>
Out copy_n(In first, In last, Size n, Out result)
{
while( n-- > 0 && first != last )
*result++ = *first++;
return result;
}
使用此实用程序,将n个元素复制到向量中非常方便和优雅:
#include<iterator>
#include<vector>
#include<iostream>
// ...
int n = 0;
std::cin >> n;
std::vector<int> v(n);
copy_n(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
n,
v.begin());
答案 2 :(得分:2)
vector<int> nums(N);
for (int i = 0; i < N; i++)
{
cin >> nums[i];
}
在一般情况下,这实际上更有效。在没有初始std::vector::push_back()
的情况下重复调用reserve
将导致大量重新分配。
答案 3 :(得分:1)
来自Diego Sevilla的回答。 使用范围构造函数
std::vector<int> nums( std::istream_iterator<int>(std::cin),
std::istream_iterator<int>() );
答案 4 :(得分:0)
无需分配矢量然后调整大小。
迭代器比索引用法更可取。
size_t N;
std::cin >> N;
std::vector<int> values(N);
for (vector<int>::iterator iter = values.begin(); iter != values.end(); ++iter)
{
std::cin >> *iter;
}