96540


Rubyでいうと下記のようなコードをC++で実現する方法を探しています（もちろんC++でも、for文を素朴に使えばできます）。

[code]

    hoges = [0, 1, 2, 3, 4, 5]
    foos = [10, 11, 12, 13, 14, 15]
    
    hoges[2..3] = foos[2..3]
    
    pp hoges
    
[/code]

結果：

[code]

    [0, 1, 12, 13, 4, 5]
    
[/code]

* * *

std::copyというのがあるようですので、まず練習として最後の２個の要素をコピーするコードを書いてみました。

[code]

    #include <iostream>
    #include <vector>
    
    std::vector<int> create_vector(int length) {
      std::vector<int> v;
      for (int i = 0; i < length; i++) {
        v.push_back(i + 1);
      }
      return v;
    }
    
    int main(void) {
      std::vector<int> hoges = create_vector(10);
    
      std::vector<int> bars;
      std::copy(hoges.end() - 2, hoges.end(), back_inserter(bars));
    
      for (const auto &bar : bars) {
        std::cout << bar << std::endl;
      }
    
      return 0;
    }
    
[/code]

結果：

[code]

    9
    10
    
[/code]

* * *

どうやら  
<https://cpprefjp.github.io/reference/algorithm/copy.html>  
によると、相手先のインデックスを指定するものがなさそうなので、Rubyのような書き方はできなさそうであると気づきました...

仮にあるとすると下記のような感じの指定方法になるかと思うのですが、可能でしょうか？

[code]

    std::vector<int> hoges = create_vector(10);
    std::vector<int> foos = create_vector(10);
    std::copy(hoges.begin() + 2, hoges.begin() + 3, foos.begin() + 2, foos.begin() + 3, foos);
    
[/code]


CC BY-SA 4.0
2023-10-21T02:06:43.920
96538
2023-10-25T22:19:19.040
9008
question
c++
std::copyもしくはこれに類似するもので、コピー先の任意の位置を指定してコピーする方法はありませんか？


> 仮にあるとすると下記のような感じの指定方法になるかと思うのですが、可能でしょうか？
[code]

    #include <iostream>
    #include <numeric>
    #include <vector>
    
    int main(void) {
      std::vector<int> hoges(6);
      std::iota(hoges.begin(), hoges.end(), 0);
      std::vector<int> foos(6);
      std::iota(foos.begin(), foos.end(), 10);
    
      std::copy(foos.begin()+2, foos.begin()+4, hoges.begin()+2);
    
      for (const auto &item: hoges) {
        std::cout << item << " ";
      }
      std::cout << std::endl;
    }
    
    # 0 1 12 13 4 5 
    
[/code]


CC BY-SA 4.0
2023-10-21T03:29:48.287
96540
2023-10-21T03:29:48.287
47127
96538
answer


実用的にはmetropolisさんの回答通りなのですが、話を一般化した場合に

>
[code]

>     std::copy(foos.begin()+2, foos.begin()+4, hoges.begin()+2);
>  
[/code]

`std::copy`に渡そうとしているイテレーターが `+` 演算子を実装していない場合があります。

そのような場合にもきちんと対処するためにC++言語では
[`std::next()`](https://cpprefjp.github.io/reference/iterator/next.html)
が用意されています。`std::next()`は`+`演算子が使えれば使い、使えなければ地道に`++`を指定回数繰り返す作りになっています。

[code]

    std::copy(std::next(foos.begin(), 2), std::next(foos.begin(), 4), std::next(hoges.begin(), 2));
    
[/code]

* * *

コメントでご指摘のあるように`std::advance()`した結果を受け取るのが`std::next()`でした。訂正します。


CC BY-SA 4.0
2023-10-24T22:55:57.597
96573
2023-10-25T22:19:19.040
2023-10-25T22:19:19.040
4236
4236
96538
answer