Получение ввода непосредственно в вектор в C ++ - PullRequest
4 голосов
/ 14 ноября 2010

Рассмотрим следующий фрагмент кода:

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

Возможно ли это сделать без использования вспомогательной переменной, в данном случае var?

Ответы [ 5 ]

10 голосов
/ 15 ноября 2010

Предполагая, что вы уже прочитали начальный 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 превращается в итератор, который добавляет элементы в вектор в конце. Потоки итераторов могут быть параметризованы по типу прочитанных элементов и, если параметры не заданы, сигнализируют об окончании ввода.

4 голосов
/ 15 ноября 2010

Если у вас еще нет 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 голосов
/ 15 ноября 2010
vector<int> nums(N);
for (int i = 0; i < N; i++)
{
    cin >> nums[i];
}

В общем случае это на самом деле более эффективно. Повторный вызов std::vector::push_back() без начального reserve приведет к большому перераспределению.

1 голос
/ 25 ноября 2010

Намекнул Диего Севилья на ответ. Используйте конструктор диапазона

std::vector<int> nums( std::istream_iterator<int>(std::cin),
                       std::istream_iterator<int>() );
0 голосов
/ 15 ноября 2010

Нет необходимости выделять вектор, а затем изменять его размер.

Итераторы предпочтительнее использования индекса.

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