C++ STLのlist::assign()関数の使い方をわかりやすく解説
本記事では、C++におけるassign()関数の動作について詳しく解説します。
list::assign()関数はC++標準テンプレートライブラリ(STL)の一部であり、リストに新しい値を代入したり、あるリストから別のリストへ値をコピーしたりするために使用されます。
この関数を呼び出すには、<list>ヘッダーファイルをインクルードする必要があります。
構文①:サイズと値を指定して代入する
リストに新しい値を代入する場合の構文は以下の通りです。
List_Name.assign(size, value)
構文②:別のリストから値をコピーする
あるリストから別のリストへ値をコピーする場合の構文は以下の通りです。
First_List.assign(Second_List.begin(), Second_List.end())
パラメータ
この関数は次の2つのパラメータを受け取ります。
- size … リストのサイズ(要素数)を表します
- value … リストの各位置に格納するデータの値を表します
戻り値
この関数には戻り値はありません。
例1:サイズと値を指定して代入する
入力: Lt.assign(3,10) 出力: リストLtのサイズは 3 です。 リストLtの要素は 10 10 10 です。
解説:
この例では、assign()関数を使ってリストにサイズと値を代入する方法を示しています。第1引数がリストのサイズ(この場合は3)となり、第2引数がリストの各位置に代入される値(ここでは10)となります。
例2:配列から値を代入する
入力: int array[5] = { 1, 2, 3, 4 }
Lt.assign(array, array+3)
出力: リストLtのサイズは 3 です。
リストLtの要素は 1 2 3 です。
解説:
この例では、配列を使ってリストに値を代入する方法を示しています。リストに代入する要素の総数が、そのままリストのサイズになります。
assign()関数の第1引数には配列名を指定し、第2引数には「配列名 + 代入したい要素数」を指定します。上記の例では3を指定しているため、配列の先頭から3つの要素がリストに代入されます。
注意: 配列の実際の要素数より大きな数(例えば6)を指定すると、配列の範囲外のメモリを読み込むことになり、未定義動作を引き起こす可能性があります。指定する要素数は配列の範囲内に収めるようにしましょう。
サンプルプログラムの流れ
- まず、リストの要素を表示するための関数
ShowList(list<int> L)を作成します。 - 表示対象リストの先頭要素を指すイテレータ
itrを作成します。 itrがリストの末尾に到達するまでループ処理を行います。main()関数内で、int型の値を扱う3つのリスト L1、L2、L3 をlist<int>として作成し、さらにint型の配列arr[]を作成して値を設定します。assign()関数でリスト L1 にサイズと値を代入し、L1 をShowList()関数に渡して表示します。assign()関数でリスト L1 の要素を L2 にコピーし、L2 をShowList()関数に渡して表示します。assign()関数で配列arr[]の要素をリスト L3 にコピーし、L3 をShowList()関数に渡して表示します。
アルゴリズム
Start Step 1-> リストの要素を表示する関数 DisplayList(list<int> L) を宣言する イテレータ itr を宣言する itr = L.begin() から itr != L.end() の間ループする(itr++) *itr を出力する Step 2-> main() 関数内で リスト L1, L2, L3 を宣言する 配列 arr[] を初期化する L1.assign(size, value) を呼び出す L1.size() を出力する L1 を表示するため DisplayList(L1) を呼び出す L2.assign(L1.begin(), L1.end()) を呼び出す L2.size() を出力する L2 を表示するため DisplayList(L2) を呼び出す L3.assign(arr, arr+4) を呼び出す L3.size() を出力する L3 を表示するため DisplayList(L3) を呼び出す Stop
サンプルコード
#include<iostream>
#include<list>
using namespace std;
//リストの要素を表示する関数
int ShowList(list<int> L) {
cout << "リストの要素は ";
list<int>::iterator itr;
for (itr = L.begin(); itr != L.end(); itr++) {
cout << *itr << " ";
}
cout << "\n";
}
int main() {
list<int> L1;
list<int> L2;
list<int> L3;
int arr[10] = { 6, 7, 2, 4 };
//リストL1にサイズと値を代入
L1.assign(3, 20);
cout << "リストL1のサイズは " << L1.size() << "\n";
ShowList(L1);
//L1の要素をL2にコピー
L2.assign(L1.begin(), L1.end());
cout << "リストL2のサイズは " << L2.size() << "\n";
ShowList(L2);
//配列arr[]の要素をリストL3にコピー
L3.assign(arr, arr + 4);
cout << "リストL3のサイズは " << L3.size() << "\n";
ShowList(L3);
return 0;
}
出力結果
上記のコードを実行すると、次のような出力が得られます。
リストL1のサイズは 3 リストの要素は 20 20 20 リストL2のサイズは 3 リストの要素は 20 20 20 リストL3のサイズは 4 リストの要素は 6 7 2 4
解説
リスト L1 に対しては、assign() 関数でサイズを3、値を20と指定したため、上記のような出力が得られます。
続いて、リスト L1 の要素を L2 にコピーしたため、出力から確認できるように、L2 は L1 と同じサイズ・同じ値を持っています。
最後に、assign() 関数を使って配列 arr[] のすべての要素をコピーしたため、L3 のサイズは4となり、その要素も配列の要素と一致しています。
まとめ
list::assign() 関数を使うことで、リストへの一括代入や、他のリスト・配列からの要素コピーを簡単に行えます。サイズと値を指定する方法、イテレータの範囲を指定する方法の2つの使い方を理解しておくと、C++のリスト操作がより柔軟になります。
-
C++ STLのlist::reverse()関数の使い方と実例解説
本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar
-
C++ STLのdeque::assign()関数の使い方を徹底解説
本記事では、C++ STLにおける deque::assign() 関数の動作について詳しく解説します。デック(deque)は「double ended queue(両端キュー)」と呼ばれるデータ構造で、先頭と末尾の両方から要素の挿入・削除が可能なコンテナです。C++の deque::assign() は組み込み関数の一つで、dequeコンテナに新しい値を割り当てるために使用されます。この関数が呼び出されるたびに、既存の要素をすべて置き換えて新しい値を設定し、それに応じてコンテナのサイズも自動的に調整されます。構文deque::assign() の構文は以下の通りです。dequename.as