function template
<memory>

std::uninitialized_copy_n

template <class InputIterator, class Size, class ForwardIterator>
  ForwardIterator uninitialized_copy_n ( InputIterator first, Size n,
                                         ForwardIterator result );
Copy block of memory
Constructs copies of the n first elements of the array pointed by first into a range beginning at result and returns an iterator to the last element in the destination range.

Unlike algorithm copy_n, uninitialized_copy_n constructs the objects in-place, instead of just copying them. This allows to obtain fully constructed copies of the elements into a range of uninitialized memory, such as a memory block obtained by a call to get_temporary_buffer or malloc.

The behavior of this function template is equivalent to:
1
2
3
4
5
6
7
8
template<class InputIterator, class Size, class ForwardIterator>
  ForwardIterator uninitialized_copy_n ( InputIterator first, Size n, ForwardIterator result )
{
  for (; n>0; ++result, ++first, --n)
    new (static_cast<void*>(&*result))
      typename iterator_traits<ForwardIterator>::value_type(*first);
  return result;
}


Parameters

first
Forward iterator to the initial position in an uninitialized sequence of at least n elements.
n
Number of elements to copy
Size is expected to be a numeric type.
result
Output iterator to the initial position in the uninitialized destination sequence. This shall not point to any element in the range [first,first+n).

Return value

An iterator to the last element of the destination sequence where elements have been copied.

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// uninitialized_copy_n example
#include <iostream>
#include <memory>
#include <string>

int main () {
  std::string numbers[] = {"one","two","three"};

  // get block of uninitialized memory:
  std::pair <std::string*,std::ptrdiff_t> result = std::get_temporary_buffer<std::string>(3);

  if (result.second>0) {
    std::uninitialized_copy_n ( numbers, result.second, result.first );

    for (int i=0; i<result.second; i++)
      std::cout << result.first[i] << ' ';
    std::cout << '\n';

    std::return_temporary_buffer(result.first);
  }

  return 0;
}


Output:
one two three 

Complexity

Linear: constructs (copy construction) n objects.

See also