function template
<memory>

std::uninitialized_copy_n

template <class InputIterator, class Size, class ForwardIterator>  ForwardIterator uninitialized_copy_n ( InputIterator first, Size n,                                         ForwardIterator result );
复制内存块
first 指向的数组的前 n 个元素复制到 result 指向的范围中,并返回指向目标范围中**最后一个**已复制元素的迭代器。

与算法 copy_n 不同,uninitialized_copy_n它会在原地构造对象,而不是仅仅复制它们。这使得可以在未初始化的内存区域(如通过调用 get_temporary_buffermalloc 获取的内存块)中获得完全构造的副本。

此函数模板的行为等同于
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;
}

参数

first
指向一个至少包含 n 个元素的未初始化序列的初始位置的 Forward 迭代器。
n
要复制的元素数量
Size 被期望为一个数值类型。
result
指向未初始化目标序列初始位置的 Output 迭代器。它不应指向范围 [first,first+n) 中的任何元素。

返回值

指向目标序列中已复制元素的最后一个元素的迭代器。

示例

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

输出
one two three 


复杂度

线性复杂度:构造(拷贝构造)n 个对象。

另见