Как автор, я рекомендую bignumber.js или big.js , «небольшую, быструю библиотеку Javascript для арифметики с произвольной точностью с десятичными числами».
Для более зрелой библиотеки рекомендуется также ICU4J BigDecimal .
Как указано в комментариях, 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 элементов или до конца
Обычно вы не должны делать это с std::copy_n
, что предполагает, что предоставленный итератор при увеличении n раз остается в силе:
Копирует точно
count
значения от диапазона, начинающегося вfirst
до диапазона, начинающегося вresult
. Формально для каждого неотрицательного целого числаi < n
выполняется*(result + i) = *(first + i)
.( статья на cppreference.com на
blockquote>std::copy_n
) sup>Если вы можете это гарантировать, тогда хорошо, но обычно с
std::cin
] это невозможно. Вы можете довольно просто разыменовать недопустимый итератор:Построенный по умолчанию
std::istream_iterator
известен как итератор конца потока. Когда действительныйstd::istream_iterator
достигает конца основного потока, он становится равным итератору конца потока. Разыменование или инкремент в дальнейшем вызывает неопределенное поведение.( статья на cppreference.com на
blockquote>std::istream_iterator
) sup>Вы в значительной степени там со своим циклом, хотя я бы вероятно, используйте более сильное условие завершения, чтобы избежать избыточного чтения из «мертвого» потока:
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 , в зависимости от того, что меньше.
( живое демо )