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

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++のリスト操作がより柔軟になります。

  1. C++ STLのlist::reverse()関数の使い方と実例解説

    本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar

  2. C++ STLのdeque::assign()関数の使い方を徹底解説

    本記事では、C++ STLにおける deque::assign() 関数の動作について詳しく解説します。デック(deque)は「double ended queue(両端キュー)」と呼ばれるデータ構造で、先頭と末尾の両方から要素の挿入・削除が可能なコンテナです。C++の deque::assign() は組み込み関数の一つで、dequeコンテナに新しい値を割り当てるために使用されます。この関数が呼び出されるたびに、既存の要素をすべて置き換えて新しい値を設定し、それに応じてコンテナのサイズも自動的に調整されます。構文deque::assign() の構文は以下の通りです。dequename.as