用C ++直接输入到向量中

时间:2010-11-14 20:58:31

标签: c++ stl vector iostream

考虑以下代码:

...
int N,var;
vector<int> nums;
cin >> N;
while (N--)
{
   cin >> var;
   nums.push_back(var);
}
...

是否可以在不使用辅助变量的情况下执行此操作,在这种情况下var

5 个答案:

答案 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;
}