C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で異なるコンテナ間のサブレンジを交換する方法

このチュートリアルでは、C++の標準ライブラリ関数 std::swap_ranges を使用して、vector や list といった異なる種類のコンテナ間でサブレンジ(部分範囲)を交換する方法を解説します。

swap_ranges 関数とは

swap_ranges<algorithm> ヘッダーで定義されているアルゴリズム関数です。第1引数と第2引数で指定した範囲 [first1, last1) の要素を、第3引数 first2 を起点とする範囲の要素と順番に入れ替えます。

重要なポイントとして、この関数は2つの範囲が異なる種類のコンテナに属していても、要素型が同じであれば正しく動作します。そのため、vector と list のように内部構造の異なるコンテナ間でも要素の交換が可能です。

サンプルコード

以下の例では、vector の先頭3つの要素と list の先頭3つの要素を交換しています。

#include <algorithm>
#include <iostream>
#include <list>
#include <vector>
using namespace std;

int main(){
    vector<int> v = { -10, -15, -30, 20, 500 };
    list<int> lt = { 10, 50, 30, 100, 50 };

    // vectorの先頭3要素とlistの先頭3要素を交換
    swap_ranges(v.begin(), v.begin() + 3, lt.begin());

    for (int n : v)
        cout << n << ' ';
    cout << '\n';

    for (int n : lt)
        cout << n << ' ';
    cout << endl;

    return 0;
}

実行結果

10 50 30 20 500
-10 -15 -30 100 50

コードの解説

swap_ranges(v.begin(), v.begin() + 3, lt.begin()) を呼び出すことで、vector v の先頭3要素「-10, -15, -30」と、list lt の先頭3要素「10, 50, 30」が入れ替わります。

その結果、v は「10, 50, 30, 20, 500」、lt は「-10, -15, -30, 100, 50」となり、それぞれのコンテナ内の残りの要素は元のまま保持されます。

なお、list は双方向イテレータしか持たないため lt.begin() + 3 のようなランダムアクセスはできませんが、vector 側のイテレータに対しては有効です。交換される要素数は、第1・第2引数で指定した範囲の長さによって決まります。

  1. C++関数からローカル配列を返す方法とは?静的配列を使った実装例を解説

    C++では、ローカル配列をそのまま関数から返すことはできません。これは、関数の呼び出しが終わるとローカル配列がメモリ上から消えてしまうためです。この問題を解決する方法の一つが、関数内で静的配列(static配列)を使用することです。静的配列の寿命はプログラム全体に及ぶため、関数から返しても上記のような問題が発生しません。以下に、実際に動作するサンプルプログラムを示します。サンプルコード#include <iostream> using namespace std; int *retArray() { static int arr[10]; for(int i = 0

  2. 【C++入門】関数から配列を返す方法|ポインタとstatic変数を使った実装テクニック

    C++では、配列全体をそのまま関数の戻り値として返すことはできません。しかし、配列へのポインタを返すことで、実質的に同じ目的を達成することが可能です。ここで注意すべき点が1つあります。関数内で宣言された通常のローカル変数(自動変数)は、関数の処理が終了すると同時にメモリから破棄されるため、そのアドレスを関数の外へ返しても正しく動作しません。この問題を解決するのがstatic変数です。ローカル変数を static として宣言すると、その変数はプログラムの実行中ずっとメモリ上に保持されるため、関数が終了した後もアドレスを安全に参照できるようになります。ポインタを返す関数の基本構文配列へのポインタを