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引数で指定した範囲の長さによって決まります。
-
C++関数からローカル配列を返す方法とは?静的配列を使った実装例を解説
C++では、ローカル配列をそのまま関数から返すことはできません。これは、関数の呼び出しが終わるとローカル配列がメモリ上から消えてしまうためです。この問題を解決する方法の一つが、関数内で静的配列(static配列)を使用することです。静的配列の寿命はプログラム全体に及ぶため、関数から返しても上記のような問題が発生しません。以下に、実際に動作するサンプルプログラムを示します。サンプルコード#include <iostream> using namespace std; int *retArray() { static int arr[10]; for(int i = 0
-
【C++入門】関数から配列を返す方法|ポインタとstatic変数を使った実装テクニック
C++では、配列全体をそのまま関数の戻り値として返すことはできません。しかし、配列へのポインタを返すことで、実質的に同じ目的を達成することが可能です。ここで注意すべき点が1つあります。関数内で宣言された通常のローカル変数(自動変数)は、関数の処理が終了すると同時にメモリから破棄されるため、そのアドレスを関数の外へ返しても正しく動作しません。この問題を解決するのがstatic変数です。ローカル変数を static として宣言すると、その変数はプログラムの実行中ずっとメモリ上に保持されるため、関数が終了した後もアドレスを安全に参照できるようになります。ポインタを返す関数の基本構文配列へのポインタを