標準テンプレートライブラリ(STL)学習ガイドのListコンテナ


STLとは?STLはStandard Template Library、標準テンプレートライブラリです.これは歴史上最も興奮したツールの最も退屈な用語かもしれません.根本的に言えば、STLはいくつかの“容器”の集合で、これらの“容器”はlist、vector、set、mapなどがあって、STLもアルゴリズムとその他のいくつかのコンポーネントの集合です.ここの「容器」とアルゴリズムの集合は、世界の多くの賢い人が長年にわたって傑作を指している.
STLの目的はコンポーネントを標準化することであり,再開発せずに既存のコンポーネントを使用できるようにすることである.STLは現在Cの一部なので、追加でインストールする必要はありません.それはあなたのコンパイラの中に組み込まれています.STLのリストは簡単な容器なので、STLの使い方を紹介するつもりです.もしあなたがこの概念を知っていれば、他のものは問題ありません.またlist容器はかなり簡単で、これを見ることができます.
本稿では、リストを定義して初期化し、その要素の数を計算し、リストから要素を検索し、要素を削除し、他の操作を行う方法について説明します.これらを行うには,STL汎用アルゴリズムはいずれも1つ以上のコンテナを操作できるが,listのメンバー関数はlistコンテナ固有の操作である2つの異なるアルゴリズムについて議論する.
これは3つの主要なSTLコンポーネントの簡明な要綱である.STLコンテナは、オブジェクト、組み込みオブジェクト、クラスオブジェクトを保存できます.オブジェクトは安全に保存され、操作できるオブジェクトのインタフェースが定義されます.卵棚に置いた卵はテーブルの上に転がらない.安全ですそのため、STL容器でのオブジェクトも安全です.私はこの比喩が古臭いと知っていますが、それは正しいです.
STLアルゴリズムは標準アルゴリズムであり,それらのコンテナ内のオブジェクトに適用できる.これらのアルゴリズムには有名な実行特性があります.オブジェクトをソートしたり、削除したり、記数したり、比較したり、特殊なオブジェクトを見つけたり、別のコンテナにマージしたり、他の有用な操作を実行したりすることができます.
STL iteratorは、コンテナ内のオブジェクトを指すポインタのようです.STLのアルゴリズムはiteratorを用いてコンテナ上で動作する.Iteratorはアルゴリズムの境界、容器の長さ、その他のことを設定します.例を挙げると、iteratorの中にはアルゴリズムに要素を読ませるだけで、アルゴリズムに要素を書かせるものもあれば、両方でもいいものもあります.Iteratorも容器で処理する方向を決めます.
コンテナのメンバー関数begin()を呼び出すことで、コンテナの開始位置を指すiteratorを得ることができます.コンテナのend()関数を呼び出して、過去の最後の値(そこに止まっている値を処理すること)を得ることができます.
これがSTLのすべてのもの、コンテナ、アルゴリズム、およびアルゴリズムがコンテナ内の要素上で動作することを許可するiteratorです.アルゴリズムは、オブジェクトを適切で標準的な方法で操作し、iteratorによって容器の正確な長さを得ることができる.これをすると、「境界を出る」ことはありません.これらのコアコンポーネントタイプに機能性が向上した他のコンポーネント、例えば関数オブジェクトもあります.これらの例を見てみましょう.まずSTLのリストを見てみましょう.
リストを定義
STLのリストをこのように定義することができます.
#include <string>
#include <list>
int main (void)
{
 list<string> Milkshakes;
 return 0;
}

これでいいです.リストを定義しました.簡単ですか.ListMilkshakesこの文は、listテンプレートクラスを宣言したインスタンスであり、クラスをインスタンス化するオブジェクトです.しかし、私たちは急いでこれをしないでください.このステップでは、文字列のlistを定義したことを知る必要があります.STLリストクラスを提供するヘッダファイルを含める必要があります.私はgcc 2.7.2で私のLinuxでこのテストプログラムをコンパイルしました.例えば:
  g test1.cpp-o test 1注意iostream.hこのヘッダファイルはSTLのヘッダファイルによって放棄された.これがこの例にそれがない理由です.
今リストがあります.実際にそれを使って物を詰めることができます.このリストに文字列を追加します.リストという非常に重要な値タイプがあります.値タイプはlistのオブジェクトのタイプです.この例では、このlistの値タイプは文字列、stringです.これは、このlistが文字列を配置するために使用されるためです.
リストのメンバー関数push_を使用するbackとpush_frontはlistに要素を挿入します.
#include <string>
#include <list>

int main (void)
{
 list<string> Milkshakes;
 Milkshakes.push_back("Chocolate");
 Milkshakes.push_back("Strawberry");
 Milkshakes.push_front("Lime");
 Milkshakes.push_front("Vanilla");
 return 0;
}

リストに4つの文字列があります.リストのメンバー関数push_back()オブジェクトをリストの後ろに配置しpush_front()オブジェクトを前に置きます.私はいつもいくつかのエラーメッセージをpush_back()リストに行ってpush_front()タイトルをlistに挿入すると、このエラーメッセージの前に印刷されます.
The list member function empty()listのメンバー関数empty()
リストが空であるかどうかを知ることが重要です.リストが空の場合、empty()というメンバー関数は真を返します.私はいつもこのように使います.すべてのプログラムをpushで使います.back()はエラーメッセージをlistに格納します.そして、empty()を呼び出すことで、このプログラムがエラーを報告したかどうかを話すことができます.もし私がlistを定義して情報を放して、警告を放して、深刻なエラーを放して、私はempty()を使って簡単にそのタイプのエラーが発生したことを言うことができます.
これらのlistを整理し、印刷する前にタイトルで整理したり、クラスに並べたりすることができます.
/*
|| Using a list to track and report program messages and status
*/
#include <iostream.h>
#include <string>
#include <list>
int main (void)
{
 #define OK 0
 #define INFO 1
 #define WARNING 2
 int return_code;
 list<string> InfoMessages;
 list<string> WarningMessages;

 // during a program these messages are loaded at various points
 InfoMessages.push_back("Info: Program started");
 // do work...
 WarningMessages.push_back("Warning: No Customer records have been found");
 // do work...

 return_code = OK;

 if (!InfoMessages.empty()) {
  // there were info messages
  InfoMessages.push_front("Informational Messages:");
  // ... print the info messages list, we'll see how later
  return_code = INFO;
 }

 if (!WarningMessages.empty()) {
  // there were warning messages
  WarningMessages.push_front("Warning Messages:");
  // ... print the warning messages list, we'll see how later
  return_code = WARNING;
 }

 // If there were no messages say so.
 if (InfoMessages.empty() && WarningMessages.empty()) {
  cout << "There were no messages " << endl;
 }

 return return_code;
}

転載:http://blogold.chinaunix.net/u2/67530/showart_602539.html