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 個物件。

另見