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 之間的距離。

另見