Namespaces
Variants

std::uninitialized_copy_n

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジのアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートおよび関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対する)
集合操作 (ソート済み範囲に対する)
マージ操作 (ソート済み範囲に対する)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
 
ヘッダ <memory>
template< class InputIt, class Size, class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy_n( InputIt first, Size count,
                                       NoThrowForwardIt d_first );
で定義 (1) (C++11以上)
(C++26よりconstexpr)
template< class ExecutionPolicy, class ForwardIt,
          class Size, class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy_n( ExecutionPolicy&& policy,
                                       ForwardIt first, Size count,
                                       NoThrowForwardIt d_first );
(2) (C++17以上)
1) コピー元範囲の先頭 d_first から最初の count 個の要素を、コピー先範囲の先頭 first に以下のように要素を構築します。

for (; count > 0; ++d_first, (void) ++first, --count)
    ::new (voidify(*d_first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type(*first);
return d_first;

初期化中に例外が発生した場合、既に構築されたオブジェクトは未規定の順序で破棄されます。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、以下の式の値が true である場合にのみオーバーロード解決に参加します。

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20以上)


d_first + [0, count) が first + [0, count) とオーバーラップする場合、動作は未定義です。

(C++20以上)

引数

first - コピーする要素の範囲の先頭
count - コピーする要素の数
d_first - ターゲット範囲の先頭
policy - 使用する実行ポリシー
型要件
-
InputItはLegacyInputIteratorの要件を満たす必要があります。
-
ForwardItはLegacyForwardIteratorの要件を満たす必要があります。
-
NoThrowForwardItはLegacyForwardIteratorの要件を満たす必要があります。
-
有効なNoThrowForwardItのインスタンスに対するインクリメント、代入、比較、間接参照は例外を投げてはなりません。

戻り値

上記の通り。

例外

2) 実行処理中:
  • 並列化に必要な一時メモリリソースが利用できない場合、std::bad_alloc が送出される。
  • アルゴリズムの引数を介してオブジェクトにアクセス中にキャッチされない例外が送出された場合、その動作は実行ポリシーによって決まる(標準ポリシーの場合、std::terminate が呼び出される)。

注記

機能テストマクロ 値 標準規格 機能
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr 特殊化された<memory>アルゴリズム用(1)

実装例

template<class InputIt, class Size, class NoThrowForwardIt>
constexpr NoThrowForwardIt uninitialized_copy_n(InputIt first, Size count,
                                                NoThrowForwardIt d_first)
{
    using T = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = d_first;
    try
    {
        for (; count > 0; ++first, (void) ++current, --count)
            ::new (static_cast<void*>(std::addressof(*current))) T(*first);
    }
    catch (...)
    {
        for (; d_first != current; ++d_first)
            d_first->~T();
        throw;
    }
    return current;
}
**注記**: 提供されたHTMLコードはC++のコードスニペットを含んでおり、指示に従って以下の通り対応しました: - HTMLタグと属性は一切翻訳せず保持 - `
`タグ内のC++コードは翻訳対象外
- C++固有の用語(関数名、キーワード、型名など)は翻訳せず保持

翻訳すべき自然言語テキストが含まれていないため、HTML構造とC++コードはそのまま保持されています。

例

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <tuple>
#include <vector>
int main()
{
    std::vector<std::string> v = {"This", "is", "an", "example"};
    std::string* p;
    std::size_t sz;
    std::tie(p, sz) = std::get_temporary_buffer<std::string>(v.size());
    sz = std::min(sz, v.size());
    std::uninitialized_copy_n(v.begin(), sz, p);
    for (std::string* i = p; i != p + sz; ++i)
    {
        std::cout << *i << ' ';
        i->~basic_string<char>();
    }
    std::cout << '\n';
    std::return_temporary_buffer(p);
}

出力例:

This is an example

欠陥報告

以下の動作を変える欠陥報告は、過去に公開されたC++標準に対して遡って適用されました。

DR 適用先 公開時の動作 正しい動作
LWG 2133 C++98 効果の説明で使用されていたforループの反復
式 ++d_first, ++first, --countにより、
引数依存の名前検索が発生し、operator,
オペランドの値を
破棄して
それらのADLを無効化する
LWG 2433 C++11 このアルゴリズムがオーバーロードされたoperator& によって乗っ取られる可能性があるstd::addressofを使用する

関連項目

オブジェクトの範囲を未初期化メモリ領域にコピーする
(関数テンプレート)
指定された数のオブジェクトを未初期化メモリ領域にコピーする
(アルゴリズム関数オブジェクト)