function template
<memory>

std::uninitialized_copy

template <class InputIterator, class ForwardIterator>  ForwardIterator uninitialized_copy ( InputIterator first, InputIterator last,                                       ForwardIterator result );
复制内存块
将范围 [first,last) 中的元素复制到以 result 开头的范围中,并返回一个指向目标范围中**最后一个**已复制元素的迭代器。

与算法 copy 不同,uninitialized_copy它原地构造对象,而不仅仅是复制它们。这使得能够将完全构造好的元素副本放入未初始化的内存范围中,例如通过调用 get_temporary_buffermalloc 获取的内存块。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
template<class InputIterator, class ForwardIterator>
  ForwardIterator uninitialized_copy ( InputIterator first, InputIterator last,
                                       ForwardIterator result )
{
  for (; first!=last; ++result, ++first)
    new (static_cast<void*>(&*result))
      typename iterator_traits<ForwardIterator>::value_type(*first);
  return result;
}

参数

first, last
指向要复制的序列的初始和最终位置的输入迭代器。使用的范围是[first,last),其中包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
result
指向未初始化目标序列的初始位置的输出迭代器。此迭代器不得指向范围 [first,last) 中的任何元素。

返回值

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

示例

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 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 ( numbers, 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 


复杂度

线性复杂度:构造(复制构造)对象的数量等于 firstlast 之间的距离。

另见