C ++ XiaobaiのSTLの最初の知人
言うまでもなく、毎日の片付け時間は終わりました。今日片付けたいのはSTL(標準テンプレートライブラリ)です。少しは知っていますが、STLは本当に使いやすいと思いますo( ̄▽  ̄)ブ。今日はSTLについての私の最初の知り合いなので、要約しましょう。
1.STLイニシャル-STLの基本概念
1.1STLの誕生
(1)ソフトウェア業界は長い間、再利用可能なものを構築することを望んでいました。
(2)C ++のオブジェクト指向およびジェネリックプログラミングのアイデアは、再利用性の向上を目的としています。
(3)ほとんどの場合、データ構造とアルゴリズムには一連の標準がないため、多くの反復作業を余儀なくされます。
(4)データ構造とアルゴリズムの一連の標準を確立するために、STLが誕生しました。
1.2 STLの基本概念
(1)STL(標準テンプレートライブラリ、標準テンプレートライブラリ)
(2)STLは、コンテナ(コンテナ)、アルゴリズム(アルゴリズム)、イテレータ(イテレータ)
(3)コンテナとアルゴリズムの間で大きく分けることができますシームレス接続イテレータを介して
(4)ほとんどすべてのSTLコードはテンプレートクラスまたはテンプレート関数を使用します
1.3
STLの6つのコンポーネントSTLは、コンテナ、アルゴリズム、イテレータ、ファンクター、アダプター(アダプター)、スペースアダプター
1の6つのコンポーネントに大別されます。コンテナー:ベクター、リスト、デック、セット、マップなどのさまざまなデータ構造、など。データの保存に使用されます。
2.アルゴリズム:sort、find、copy、for_eachなどの一般的に使用されるさまざまなアルゴリズム。
3.イテレーター:コンテナーとアルゴリズムの間の接着剤として機能します。
4.ファンクター:同様の関数をアルゴリズムの戦略として使用できます。
5.アダプター:コンテナー、ファンクター、またはイテレーターのインターフェースを装飾するために使用されるもの。
6.スペースアダプター:スペースの構成と管理を担当します。
1.4 STL
コンテナのコンテナ、アルゴリズム、およびイテレータ:ストレージの場所
。STLコンテナは、最も広く使用されているデータ構造を実装します。
一般的に使用されるデータ構造:配列、リンクリスト、数値、スタック、キュー、セット、マッピングテーブルなど。
これらのコンテナは、シーケンスコンテナと連想コンテナの2つのタイプに分けられます。シーケンスコンテナ:
値の順序を強調します。シーケンスコンテナの各要素の位置は固定されています。
連想コンテナ:バイナリツリー構造。要素間に厳密な物理的順序関係はありません。
アルゴリズム:問題の解決には、
論理的または数学的問題を解決するための限られたステップもあります。これをサブジェクトアルゴリズム(アルゴリズム)と呼びます。
アルゴリズムは、定性的アルゴリズムと非定性的アルゴリズムに分けられます。
定性的変更アルゴリズム:コピー、置換、削除などの操作中に、間隔内の要素の内容が変更されることを意味します。
非定性的アルゴリズム:検索、カウント、トラバース、極値の検索などの操作中に、間隔内の要素の内容が変更されないことを意味します。
イテレータ:コンテナとアルゴリズムの間の接着剤
コンテナの内部表現を公開せずに、コンテナに含まれるさまざまな要素を順番に検索する方法を提供します。
各コンテナには独自の
イテレータがあり、イテレータの使用法はポインタと非常によく似ています。初期段階では、イテレータがポインタであることが理解できます。イテレータの
タイプ:
入力イテレータ
コンテナで一般的に使用されるイテレータのタイプは、双方向イテレータとランダムアクセスイテレータです。
1.5ベクトルは組み込みのデータ型を格納します
コンテナ:ベクトル
アルゴリズム:for_each
イテレータ:ベクトル::イテレータ
STLアルゴリズムヘッダーファイル:#include <algorithm>
3つのトラバーサルイテレータとテストコード:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void myPrint(int val)
{
cout<<val<<endl;
}
void test01()
{
//创建了一个vector容器,数组
vector<int> v;
//向容器中插入数据
v.push_back(10);
v.push_back(11);
v.push_back(12);
v.push_back(13);
v.push_back(14);
//通过迭代器访问容器中的数据
vector<int>::iterator itBegin=v.begin();//起始迭代器 指向容器中第一个元素
vector<int>::iterator itEnd=v.end();//结束迭代器 指向容器中最后一个元素的下一个位置
//第一种遍历方式
while(itBegin!=itEnd)
{
cout<<*itBegin<<endl;
itBegin++;
}
//第二种遍历方式
for(vector<int>::iterator it=v.begin();it !=v.end();it++)
{
cout<<*it<<endl;
}
//第三种遍历方式 利用STL提高遍历算法
for_each(v.begin(),v.end(),myPrint);//需要在声明一个myPrint的函数
}
int main()
{
test01();
system("pause");
return 0;
}
1.6カスタムデータ型をベクターに格納するためのデモンストレーションコードは
次のとおりです。
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//vector容器中存放自定义数据类型
class Person
{
public:
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
};
void test01()
{
vector<Person>v;
Person p1("wjx",11);
Person p2("p",11);
Person p3("苏",10);
Person p4("re",11);
Person p5("tyu",11);
//向容器中添加数据
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
//遍历容器中的数据
for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"姓名:"<<(*it).m_Name<<"年龄:"<<(*it).m_Age<<endl;
cout<<"姓名:"<<it->m_Name<<"年龄:"<<it->m_Age<<endl;
}
}
void test02()
{
vector<Person*>v;
Person p1("wjx",11);
Person p2("py",11);
Person p3("苏",10);
Person p4("re",11);
Person p5("tyu",11);
//向容器中添加数据
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
//遍历容器
for(vector<Person *>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"姓名:"<<(*it)->m_Name<<"年龄:"<<(*it)->m_Age<<endl;
}
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
1.7コンテナのネストされたコンテナ
2次元配列呼び出しと同様に、使用コードは次のとおりです。
全体の大きなコンテナと、大きなコンテナに含まれる小さなコンテナに分割されます。
#include<iostream>
using namespace std;
#include<vector>
//容器嵌套容器
void test01()
{
vector<vector<int>>v;
//创建小容器
vector<int>v1;
vector<int>v2;
vector<int>v3;
vector<int>v4;
//向小容器中添加数据
for(int i=0;i<=4;i++)
{
v1.push_back(i+1);
v2.push_back(i+2);
v3.push_back(i+3);
v4.push_back(i+4);
}
//将小容器插入到大容器中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
//通过大容器将所有数组遍历一遍
for(vector<vector<int>>::iterator it=v.begin();it!=v.end();it++)
{
//(*it)通过小容器vector(int)调用\看<>括号里是什么数据类型解出来就是什么数据类型
for(vector<int>::iterator vit=(*it).begin ();vit!=(*it).end();vit++)
{
cout<<*vit<<" ";
}
cout<<endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}