Как прочитать N целых чисел в вектор?

Как автор, я рекомендую bignumber.js или big.js , «небольшую, быструю библиотеку Javascript для арифметики с произвольной точностью с десятичными числами».

Для более зрелой библиотеки рекомендуется также ICU4J BigDecimal .

18
задан JorgeAmVF 18 January 2019 в 14:04
поделиться

2 ответа

Как указано в комментариях, copy_n небезопасно для этой работы, но вы можете использовать copy_if с изменяемой лямбдой:

#include <iterator>
#include <vector>
#include <iostream>
#include <algorithm>

int main(){
    const int N = 10;
    std::vector<int> v;
    //optionally v.reserve(N);
    std::copy_if(
        std::istream_iterator<int>(std::cin),
        std::istream_iterator<int>(), 
        std::back_inserter(v), 
        [count=N] (int)  mutable {
            return count && count--;
    });

    return 0;
}

как указано в этом ответе: std :: скопировать n элементов или до конца

0
ответ дан bartop 18 January 2019 в 14:04
поделиться

Обычно вы не должны делать это с std::copy_n, что предполагает, что предоставленный итератор при увеличении n раз остается в силе:

Копирует точно count значения от диапазона, начинающегося в first до диапазона, начинающегося в result. Формально для каждого неотрицательного целого числа i < n выполняется *(result + i) = *(first + i).

( статья на cppreference.com на std::copy_n )

Если вы можете это гарантировать, тогда хорошо, но обычно с std::cin ] это невозможно. Вы можете довольно просто разыменовать недопустимый итератор:

Построенный по умолчанию std::istream_iterator известен как итератор конца потока. Когда действительный std::istream_iterator достигает конца основного потока, он становится равным итератору конца потока. Разыменование или инкремент в дальнейшем вызывает неопределенное поведение.

( статья на cppreference.com на std::istream_iterator )

Вы в значительной степени там со своим циклом, хотя я бы вероятно, используйте более сильное условие завершения, чтобы избежать избыточного чтения из «мертвого» потока:

vector<int> v(n);
for(vector<int>::size_type i = 0; i < n; i++)
    if (!cin >> v[i])
       break;

Я бы соблазнился на самом деле обернуть это во что-то вроде std::copy_n, но принимает полный «диапазон», чей границы могут быть проверены в дополнение к подсчету от 0 до N .

Реализация может выглядеть следующим образом:

template<class InputIt, class Size, class OutputIt>
OutputIt copy_atmost_n(InputIt first, InputIt last, Size count, OutputIt result)
{
   for (Size i = 0; i < count && first != last; ++i)
      *result++ = *first++;
   return result;
}

Вы бы использовали это так:

copy_atmost_n(
   std::istream_iterator<int>(std::cin),
   std::istream_iterator<int>(),
   N,
   std::back_inserter(v)
);

Теперь вы получаете M элементов, где [1122 ] M - это либо количество предоставленных входов, либо N , в зависимости от того, что меньше.

( живое демо )

0
ответ дан Lightness Races in Orbit 18 January 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: