C++ STLのarray::fill()とarray::swap()の使い方をサンプルコード付きで解説
はじめに
C++のSTL(Standard Template Library)には、固定長配列を扱うためのstd::arrayコンテナが用意されています。本記事では、そのメンバ関数であるarray::fill()とarray::swap()の役割と具体的な使い方を、サンプルコードと実行結果をもとにわかりやすく解説します。
array::fill() ― 配列を指定した値で満たす
array::fill()は、配列のすべての要素を引数で指定した値で一括して上書きする関数です。配列全体を同じ値で初期化したい場合や、値をリセットしたい場合に非常に便利です。
まず、配列の現在の要素を出力し、その後fill(5)を呼び出して全要素を「5」で埋めた例を見てみましょう。
サンプルコード
#include<iostream>
#include<array>
using namespace std;
main() {
array<int, 10> arr = {00, 11, 22, 33, 44, 55, 66, 77, 88, 99};
cout << "Array elements: ";
for(auto it = arr.begin(); it != arr.end(); it++){
cout << *it << " ";
}
// 配列を5で埋める
arr.fill(5);
cout << "\nArray elements after fill: ";
for(auto it = arr.begin(); it != arr.end(); it++){
cout << *it << " ";
}
}実行結果
Array elements: 0 11 22 33 44 55 66 77 88 99 Array elements after fill: 5 5 5 5 5 5 5 5 5 5
実行結果からわかるように、arr.fill(5)を呼び出した直後に、配列内の10個すべての要素が「5」に置き換えられています。fill()の計算量はO(n)であり、要素数に比例した時間がかかりますが、ループを自分で書くよりも簡潔で意図が明確になるというメリットがあります。
array::swap() ― 2つの配列の中身を入れ替える
array::swap()は、同じ型・同じサイズを持つ2つの配列の内容を丸ごと入れ替えるための関数です。片方の配列の各要素ともう片方の配列の対応する要素が一括して交換されます。
次の例では、異なる値を持つ2つの配列arr1とarr2を用意し、swap()を呼び出して中身を入れ替えています。
サンプルコード
#include<iostream>
#include<array>
using namespace std;
main() {
array<int, 10> arr1 = {00, 11, 22, 33, 44, 55, 66, 77, 88, 99};
array<int, 10> arr2 = {85, 41, 23, 65, 74, 02, 51, 74, 98, 22};
cout << "Array1 elements: ";
for(auto it = arr1.begin(); it != arr1.end(); it++){
cout << *it << " ";
}
cout << "\nArray2 elements: ";
for(auto it = arr2.begin(); it != arr2.end(); it++){
cout << *it << " ";
}
// 配列同士を入れ替える
arr1.swap(arr2);
cout << "\nArray1 elements (After swap): ";
for(auto it = arr1.begin(); it != arr1.end(); it++){
cout << *it << " ";
}
cout << "\nArray2 elements (After swap): ";
for(auto it = arr2.begin(); it != arr2.end(); it++){
cout << *it << " ";
}
}実行結果
Array1 elements: 0 11 22 33 44 55 66 77 88 99 Array2 elements: 85 41 23 65 74 2 51 74 98 22 Array1 elements (After swap): 85 41 23 65 74 2 51 74 98 22 Array2 elements (After swap): 0 11 22 33 44 55 66 77 88 99
実行結果の通り、swap()呼び出し後にはarr1に元々arr2が持っていた値が、逆にarr2には元々arr1が持っていた値が格納されています。なお、std::arrayは固定長かつ連続したストレージを持つため、swap()は内部的に要素を1つずつ交換する方式となり、計算量はO(n)になります。また、要素型のスワップ操作が例外を投げない場合、swap()自体も例外を投げません。
まとめ
- array::fill():配列の全要素を指定した1つの値でまとめて上書きする。初期化やリセットに便利。
- array::swap():同じ型・サイズの2つの配列の内容を効率よく入れ替える。要素を手動でコピーする必要がない。
どちらもstd::arrayを使う際に頻繁に活躍する基本操作なので、ぜひ使いこなせるようにしておきましょう。
-
C++ STLのarray::crbegin()とarray::crend()の使い方を解説
この記事では、C++ STLのstd::arrayが提供するcrbegin()とcrend()という2つのメンバ関数について詳しく解説します。これらの関数を使うと、配列の要素を逆順に安全に走査することができます。 array::crbegin() とは array::crbegin()は、コンテナの逆順イテレータ(リバースイテレータ)を取得するための関数です。戻り値は定数(const)の逆順イテレータであり、コンテナの最後の要素を指します。 「c」が接頭辞についていることからわかるように、このイテレータは読み取り専用です。つまり、イテレータを通じて要素の値を変更しようとするとコンパイルエラーに
-
C++STLのunordered_multimap swap()関数の使い方を解説
C++ STLのunordered_multimapにおけるswap()関数は、同じサイズ・同じ型の2つのmultimapコンテナ同士で要素を入れ替えるために使用される関数です。この記事では、swap()関数の基本的な使い方を、アルゴリズムとサンプルコードを交えてわかりやすく解説します。アルゴリズムswap()関数を使った処理の流れは以下の通りです。開始 空のmapコンテナ m と m1 を宣言する。 m と m1 の両方に値を挿入する。 swap()関数を実行し、m と m1 の値を入れ替える。 入れ替え後の m の値を出力する。 入れ替え後の m1