C++ STL で STL リストコンテナを使用する

胡金庫 2023年10月12日
  1. C++ で std::list<T> を使用してリストコンテナオブジェクトを宣言する
  2. C++ で insert() 関数を使用してリスト内の指定された場所に要素を挿入する
  3. C++ で swap() 関数を使用して 2つのリストの要素を交換する
  4. C++ で merge() 関数を使用して 2つのソートされたリストを 1つに結合する
C++ STL で STL リストコンテナを使用する

この記事では、C++ で STL list コンテナーを使用する方法に関する複数の方法を示します。

C++ で std::list<T> を使用してリストコンテナオブジェクトを宣言する

std::list コンテナは標準テンプレートライブラリの一部であり、任意の位置からの要素の一定時間の挿入/削除を提供するリストデータ構造を実装します。これは通常、二重にリンクされたリストとして実装され、std::forward_list とは対照的に双方向の反復をサポートします。欠点として、std::list には、std::vectorstd::deque のような要素への高速ランダムアクセスが装備されていません。最初と最後の要素にアクセスするために、frontback の 2つの一定時間関数のみを提供します。std::list は、次のサンプルコードに示すように、指定されたデータ型と一般的な初期化子リスト表記で初期化できます。push_back および push_front メソッドを使用して、リストのいずれかの側に要素を追加できます。

#include <algorithm>
#include <iostream>
#include <list>

using std::cout;
using std::endl;
using std::list;

template <typename T>
void printList(list<T> l) {
  for (const auto &item : l) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  std::list<int> l1 = {11, 12, 13, 14};

  l1.push_front(15);
  printList(l1);
  l1.push_back(16);
  printList(l1);

  return EXIT_SUCCESS;
}

出力:

15; 11; 12; 13; 14;
15; 11; 12; 13; 14; 16;

C++ で insert() 関数を使用してリスト内の指定された場所に要素を挿入する

insert() メンバー関数を使用して、特定の位置に要素を追加できます。関数には複数のオーバーロードがあり、最初のオーバーロードは、イテレーターとオブジェクトへの参照の 2つの引数のみを取ります。指定された要素は、イテレータが指す要素の前に挿入されます。次のコードスニペットは、リスト内の特定の値を見つけて、その前に目的の要素を挿入する方法を示しています。

#include <algorithm>
#include <iostream>
#include <list>

using std::cout;
using std::endl;
using std::list;

template <typename T>
void printList(list<T> l) {
  for (const auto &item : l) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  std::list<int> l1 = {11, 12, 13, 14};

  printList(l1);
  auto iter = std::find(l1.begin(), l1.end(), 13);
  if (iter != l1.end()) {
    l1.insert(iter, 55);
  }
  printList(l1);

  return EXIT_SUCCESS;
}

出力:

11; 12; 13; 14;
11; 12; 55; 13; 14;

C++ で swap() 関数を使用して 2つのリストの要素を交換する

std::list コンテナのもう 1つの便利なメンバー関数は、swap() です。これは、リストオブジェクトの要素を、唯一の引数として渡される別のリストと交換します。この操作は個々の要素を移動またはコピーせず、すべてのイテレータ/参照は関数呼び出し後も有効なままであることに注意してください。

#include <algorithm>
#include <iostream>
#include <list>

using std::cout;
using std::endl;
using std::list;

template <typename T>
void printList(list<T> l) {
  for (const auto &item : l) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  std::list<int> l1 = {11, 12, 13, 14};
  std::list<int> l2 = {1, 2, 3, 4, 11};

  cout << "l2: ";
  printList(l2);
  l2.swap(l1);
  cout << "l2: ";
  printList(l2);

  return EXIT_SUCCESS;
}

出力:

l2: 1; 2; 3; 4; 11;
l2: 11; 12; 13; 14;

C++ で merge() 関数を使用して 2つのソートされたリストを 1つに結合する

または、merge メンバー関数を使用して、2つのソートされたリストの要素を 1つに結合することもできます。両方のリストを昇順で並べ替える必要があることに注意してください。merge はリストオブジェクトへの参照を取り、その要素は呼び出し元オブジェクトにマージされます。操作後、引数として渡されたリストオブジェクトが空になります。この関数は、次のコードサンプルに示すように、結果のリストオブジェクトの要素を昇順で並べ替えます。

#include <algorithm>
#include <iostream>
#include <list>

using std::cout;
using std::endl;
using std::list;

template <typename T>
void printList(list<T> l) {
  for (const auto &item : l) {
    cout << item << "; ";
  }
  cout << endl;
}

int main() {
  std::list<int> l1 = {8, 10, 2, 4};
  std::list<int> l2 = {7, 3, 9, 5, 1};

  l2.sort();
  l1.sort();
  cout << "l2: ";
  printList(l2);

  l2.merge(l1);

  cout << "l2: ";
  printList(l2);

  return EXIT_SUCCESS;
}

出力:

l2: 1; 3; 5; 7; 9;
l2: 1; 2; 3; 4; 5; 7; 8; 9; 10;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ List