Как отметил Стив , для этого потребуется copy_n()
, которого из-за недосмотра нет в текущей стандартной библиотеке, но он будет в C + + 1x. Вы можете легко реализовать его самостоятельно, вот один, который я считаю правильным:
template<class InIt, class OutIt>
OutIt copy_n(InIt src, OutIt dest, size_t n)
{
if (!n) return dest;
*dest = *src;
while (--n)
*++dest = *++src;
return ++dest;
}
Обратите внимание, что std::copy_n()
предполагает, что входной итератор может доставлять n
объектов. При чтении из файла это может быть проблематично.
Отсутствует std::copy_n()
, вы можете использовать std::generate_n
.
template< typename InIt >
struct input_generator {
typedef std::iterator_traits<InIt>::value_type value_type;
input_generator(InIt begin, InIt end) begin_(begin), end_(end) {}
value_type operator()()
{
assert(it_ != end);
return *it_++;
}
Init begin_;
Init end_;
};
std::vector<char> buffer;
buffer.reserve(42);
std::generate_n( std::back_inserter(buffer)
, 42
, input_generator(std::istream_iterator<char>(file))
, input_generator(std::istream_iterator<char>()) );
Однако я не вижу в этом преимущества перед чтением непосредственно из файла, как avakar показал .