C++_std::copy 追加

勘違いしていた。引数に指定した分がコピーされるのではなく、-1 されてコピーされる。
故に第二引数は、コピーしたい範囲の + 1 とする。

 

std::copy ( InputIt first, InputIt last, OutputIt d_first );

first, last コピーする要素の範囲。
d_first コピー先の範囲の先頭。
戻り値 コピー先の範囲内の最後にコピーした要素の、
次の要素を指す出力イテレータ

範囲 [ first, last ) の要素をすべて、first から開始して last - 1 までコピーする。
d_first が範囲 [ first, last ) 内の場合、動作は未定義。

 

ex )

    std::vector<int> src = { 0, 1, 2, 3, 4, 5, 6, 7 };
    std::vector<int> dst = { 10, 11, 12, 13, 14, 15, 16, 17 };

    std::vector<int>::iterator s = std::next(src.begin(), 1); // 1 回前方に進めたイテレータを返す
    decltype(src)::iterator e = std::next(src.begin(), 3);    // 3 同上
    decltype(src)::iterator r = std::next(dst.begin(), 1);

    decltype(src)::iterator a = std::copy(s, e, r);
    std::cout << *s << std::endl; // 1 が表示
    std::cout << *e << std::endl; // 3 が表示
    std::cout << *a << std::endl; // 13 が表示

    for each(auto d in dst)
    {
        std::cout << d << std::endl;
    }
    // 10, 1, 2, 13, 14, 15, 16, 17

 ちなみに、e を 4 に変更すると、10, 1, 2, 3, 14, 15, 16, 17 となる。
end イテレータは、最後尾要素の次を指すイテレータを取得。

 

 

ソースMemo ※メンドイので変数名使い回し。

    // イテレータ1 回進める
    std::vector<int>::iterator s = src.begin();
    std::advance(s, 1);

    // 1 回前方に進めたイテレータを返す
    std::vector<int>::iterator s = std::next(src.begin(), 1);
   
    // 指定した式の型を取得する
    int i = 0;
    decltype(i) j ; // j は int 型

 

 

 

こちらから。
https://ja.cppreference.com/w/cpp/algorithm/copy
https://cpprefjp.github.io/reference/iterator.html
https://cpprefjp.github.io/lang/cpp11/decltype.html

以上。