Getting input directly into a vector in C++

时光毁灭记忆、已成空白 提交于 2019-12-01 17:24:24

问题


Consider the following code piece:

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

Is it possible to do this without using an auxillary variable, in this case var?


回答1:


Assuming you have already read the initial N, there is a nice trick using 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));

The back_inserter object turns itself into an iterator that adds elements to the vector at the end. Iterator streams can be parameterized by the type of the elements read, and, if no parameter given, signals the end of input.




回答2:


If you don't have already copy_n() in your toolbelt then you should. Very useful.

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

With this utility it's convenient and elegant to copy n elements into a vector:

#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());



回答3:


vector<int> nums(N);
for (int i = 0; i < N; i++)
{
    cin >> nums[i];
}

In the general case, this is actually more efficient. Calling std::vector::push_back() repeatedly without an initial reserve will lead to lots of reallocations.




回答4:


Hinted from Diego Sevilla answer. Use a range constructor

std::vector<int> nums( std::istream_iterator<int>(std::cin),
                       std::istream_iterator<int>() );



回答5:


No need to allocate the vector and then resize it.

Iterators are preferable to index usage.

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


来源:https://stackoverflow.com/questions/4179655/getting-input-directly-into-a-vector-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!