C++ 標準テンプレート ライブラリ (STL) - ベクター、セット、文字列、マップ


1 つ、ベクトル

ベクターとは「必要に応じて長さが自動的に変化する配列」です。アルゴリズムでは、通常の配列を使用するとメモリを超える場合がありますが、その場合はベクトル配列を使用できます。さらに、ベクトル配列を使用して、隣接リストの形式でグラフを保存することもできます。これは、隣接行列を使用できず、ポインタを使用して隣接リストを実装するのが怖い人にとって非常に使いやすいものです。

ベクターを使用するには、ヘッダー ファイル #include<vector> を追加する必要があります。さらに、「namespace std を使用する」という文を追加します。

1. ベクトルの定義:

vector<typename> name;

typename は基本的なデータ型です。

vector<int> name;
vector<double> name;
vector<char> name;
vector<node> name;//node是结构体类型

Vector は STL 標準コンテナにすることもできますが、この場合、定義時に >> の間にスペースを追加する必要があります。コンパイラによっては、これをシフト演算とみなしてコンパイル エラーが発生するためです。次のように:

vector<vector<int> > name;

上記の方法は 2 次元配列と関連付けることができ、この 2 次元ベクトル配列は 2 次元が辺の長さを持ち得る 2 次元配列として理解できます。

ベクトル配列を定義します。

vector<typename> ArrayName[arraySize]; 

上記の定義では、1次元の長さをarraySizeに固定します。

2. ベクターコンテナ内の要素へのアクセス:

添字によるアクセス:通常の配列と同様、添字は0~vi.size()-1

イテレータを介したアクセス: イテレータはポインタに似たものとして理解できます。

vector<typename>::iterator it;

このようにして、イテレータ it が取得され、*it を通じて内部の要素にアクセスできるようになります。

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 0 ; i < 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vector<int>::iterator it = vi.begin();//it指向vi的首地址
    for(int i = 0 ; i < 5 ; i++)
        printf("%d ",*(it+i));
    return 0;
}

アクセスする別の方法もあります。

    //迭代器能够实现自增操作
    for(vector<int>::iterator it = vi.begin();it!=vi.end();it++)
        printf("%d ",*it);

3. Push_back() 関数:
Push_back(x) は、ベクトルの後ろに要素 x を追加することを指し、時間計算量は O(1) です。

4. Pop_back() 関数は
ベクトルの末尾の要素を削除します。時間計算量は O(1) です。

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 0 ; i < 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.pop_back();
    //迭代器能够实现自增操作
    for(vector<int>::iterator it = vi.begin();it!=vi.end();it++)
        printf("%d ",*it);
    return 0;
}

ここに画像の説明を挿入

5. size() は
ベクトル内の要素の数を取得し、時間計算量は O(1) です。

6. clear() は、
ベクター内のすべての要素をクリアするために使用されます。

7. insert()
insert(it,x): ベクトルの任意の反復子 it に要素 x を挿入するために使用され、時間計算量は O(N) です。

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1 ; i <= 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.insert(vi.begin()+2,-1);//将-1插入到vi[2]的位置
    for(int i = 0 ; i < vi.size() ; i++)
        printf("%d ",vi[i]);
    return 0;
}

ここに画像の説明を挿入

8. Erase() は
単一の要素を削除します Erase(it): 反復子が存在する要素を削除します

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1 ; i <= 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.erase(vi.begin()+2);//将-删除vi[2]
    for(int i = 0 ; i < vi.size() ; i++)
        printf("%d ",vi[i]);
    return 0;
}

ここに画像の説明を挿入
Erase(first,last): [first,last) 範囲内の要素を削除します。

#include<stdio.h>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1 ; i <= 5 ; i++)
        vi.push_back(i);//在vi末尾依次添加元素i
    vi.erase(vi.begin()+2,vi.begin()+4);//将-删除vi[2]、vi[3]
    for(int i = 0 ; i < vi.size() ; i++)
        printf("%d ",vi[i]);
    return 0;
}

ここに画像の説明を挿入
一般的な用途:

  • 要素が不確実な場合にスペースを節約できる
  • 場合によっては出力要素の数が不確実であるため、余分なスペースを出力せずに条件を満たす最後の要素をより便利に処理するには、最初にベクトルを使用して出力する必要があるすべての要素を記録してから、それらをすべて出力することができます。すぐに。
  • 隣接リストを含むグラフの保存

2個セット

set は、要素が繰り返されずに自動的に順序付けされ、切り取られるコレクションです。使用する場合は、 #include< set > を追加し、名前空間 std を使用する必要があります。

1. セットの定義:

set<typename> name;

具体的な定義方法はベクターと同じです

2. セット内の要素へのアクセス:
セットにはイテレータを介してのみアクセスでき、ベクトルと文字列以外の STL コンテナは *(it+i) のアクセス方法をサポートしていないため、次の方法でのみ列挙できます。 :

#include<stdio.h>
#include<set>
using namespace std;

int main(){
    set<int> st;
    st.insert(3);//将3插入st中
    st.insert(5);
    st.insert(2);
    st.insert(3);
    //注意:不支持it<st.end()写法
    for(set<int>::iterator it = st.begin();it!=st.end();it++)
        printf("%d ",*it);
    return 0;
}

ここに画像の説明を挿入
セット内の要素が段階的に自動的に並べ替えられ、重複した要素が削除されていることがわかります。

3. insert()
insert(x) は、x を Set コンテナに挿入し、ソートと重複排除を自動的に強化します。

4. find()
find(value) は、セット内の value に対応するイテレータを返します。

#include<stdio.h>
#include<set>
using namespace std;

int main(){
    set<int> st;
    for(int i = 1 ; i <=3 ; i++)
        st.insert(i);
    set<int>::iterator it = st.find(2);
    printf("%d",*it);
    return 0;
}

5、消去()

単一の要素を削除します: st.erase(it)、これは削除する要素のイテレータであり、find() 関数と組み合わせて使用​​できます; st.erase(value)、value は要素の値です削除される

間隔内の要素を削除: st.erase(first,last)、間隔内の要素を削除 [first,last)

#include<stdio.h>
#include<set>
using namespace std;

int main(){
    set<int> st;
    st.insert(20);
    st.insert(10);
    st.insert(40);
    st.insert(30);
    set<int>::iterator it = st.find(30);
    st.erase(it,st.end());//st.end()指向末尾元素的下一个位置,这里即删除30、40
    for(it = st.begin();it!=st.end();it++)
        printf("%d ",*it);
    return 0;
}

6. size() は、
セット内の要素の数を取得するために使用されます。

7. clear() は、
セット内のすべての要素をクリアするために使用されます。

3、文字列

C 言語では、文字配列 char str[] は通常、文字列を格納するために使用されます。C++ では、文字列の共通関数をカプセル化する文字列型が導入されています。string を使用するには、#include<string> を追加し、名前空間 std を使用する必要があります (string.h と string は異なるヘッダー ファイルです)。

1. 文字列の定義:

string str;

string str1 = "abcd";

2. 文字列内のコンテンツへのアクセス:
(1) 添え字によるアクセス:

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str;
    cin>>str;
    for(int i = 0 ; i < str.length() ; i++)
        printf("%c",str[i]);
    return 0;
}

(2) イテレータを介したアクセス:

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str;
    cin>>str;
    for(string::iterator it = str.begin();it!=str.end();it++)
        printf("%c ",*it);
    return 0;
}

3.演算子+=は
2つの文字列を直接結合できます

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str1,str2,str3;
    cin>>str1;
    cin>>str2;
    str3 = str1+str2;
    cout<<str3;
    return 0;
}

4. 比較演算子
2 つの文字列型は、==、!=、<、<=、>、>= を使用してサイズを比較できます。比較ルールは辞書順です。

5. length()/size()
length() は文字列の長さ、つまり格納されている文字数を返します。

6. insert()
insert(pos, string)、位置 pos に文字列を挿入

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str1,str2;
    cin>>str1;
    cin>>str2;
    str1.insert(2,str2);
    cout<<str1;
    return 0;
}

ここに画像の説明を挿入
insert(it, it2, it3): 挿入される元の文字列の位置です。it2, it3 は、挿入される文字列の最初の反復子であり、文字列 [it2, it3) が次の位置に挿入されることを示します。それ

7. Erase() は
単一の要素を削除します: str.erase(it) これは削除される要素のイテレータです。

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "abcdefg";
    str.erase(str.begin()+4);
    cout<<str;
    return 0;
}

間隔内の要素を削除: str.erase(first,last)、間隔内の要素を削除 [first,last)

範囲内の要素を削除します: str.erase(pos,length)。pos は要素を削除する必要がある開始位置、length は削除する文字数です。

8. clear() は
文字列内のデータをクリアします

9. substr()
substr(pos,len): pos ビットから始まり、len の長さの文字列

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "Thank you for your smile.";
    cout<<str.substr(0,5)<<endl;//Thank
    cout<<str.substr(14,4)<<endl;//your
    cout<<str.substr(19,5)<<endl;//smile
    return 0;
}

10. string::npos
string::npos は定数であり、その値自体は -1 ですが、unsigned int 型であるため、unsigned int の最大値と考えることもできます。find()関数の不一致の戻り値として使用されます。

11. find()
str.find(str2): str2 が str の文字列の場合、str 内の最初の出現位置を返します。str2 が str の文字列でない場合は、string::npos を返します。

str.find(str2, pos): str の pos 位置から str2 のマッチングを開始します。戻り値は上記と同じです。

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "Thank you for your smile.";
    string str2 = "you";
    if(str.find(str2)!=string::npos){
        cout<<str.find(str2)<<endl;
    }
    return 0;
}

12. replace()
str.replace(pos, len, str2): str を pos から始まり len の長さの文字列に置き換えます str2 str.replace(
it1, it2, str2): str のイテレータを置き換えます [it1 , it2)範囲内の文字列置換ビット str2

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "Maybe you will turn around.";
    string str2 = "will not";
    string str3 = "surely";
    cout<<str.replace(10,4,str2)<<endl;
    cout<<str.replace(str.begin(),str.begin()+5,str3);
    return 0;
}

ここに画像の説明を挿入

4、地図

マップはマッピングと訳されます。map は、任意のプリミティブ型 (STL コンテナを含む) を任意のプリミティブ型 (STL コンテナを含む) にマップできます。マップを使用するには、#include<map> ヘッダー ファイルを追加し、名前空間 std を使用する必要があります。

1. マップの定義

map<typename1,typename2> mp; //第一个是键的类型,第二个是值的类型,键是唯一的

文字列から整数へのマッピングの場合は、char 配列の代わりに string を使用する必要があります。

map<string,int> mp;

マップ内の要素へのアクセス:
(1) キーによるアクセス (キーは一意です):

#include<map>
#include<stdio.h>
using namespace std;

int main(){
    map<char,int> mp;
    mp['c'] = 20;
    mp['c'] = 30;
    printf("%d\n",mp['c']);//30
    return 0;
}

(2) イテレータによるアクセス

map<typename1,typename2>::iterator it;

それを介してキーにアクセスします -> 最初に、それを介して値にアクセスします -> 2番目

#include<map>
#include<stdio.h>
using namespace std;

int main(){
    map<char,int> mp;
    mp['m'] = 20;
    mp['r'] = 30;
    for(map<char,int>::iterator it = mp.begin();it!=mp.end();it++){
        printf("%c %d\n",it->first,it->second);
    }
    return 0;
}

マップのキーは小さいものから大きいものの順に自動的にソートされます。

3. find():
find(key) は、キーが key であるマップのイテレータを返します。

#include<map>
#include<stdio.h>
using namespace std;

int main(){
    map<char,int> mp;
    mp['m'] = 20;
    mp['r'] = 30;
    map<char,int>::iterator it = mp.find('m');
    printf("%c %d\n",it->first,it->second);//m 20
    return 0;
}

4. Erase() は
単一の要素を削除します: mp.erase(it) これは削除される de 要素の反復子です。

単一の要素を削除します: mp.erase(key): key は削除するマッピングのキーです。

範囲内の要素を削除します: mp.erase(first, last)、first と last は両方ともイテレータであり、削除された要素の範囲は [first, last) です。

5. size() は
マップにマッピングされた対数を取得します

6. clear() は
マップ内のすべての要素をクリアします

一般的な用途:

  • 文字または文字列と整数の間のマッピングを確立する必要がある質問
  • 大きな整数または他のタイプのデータが存在するかどうかを判断するには、map を bool 配列として使用できます

注: マップのキーと値は 1 対 1 に対応しています。キーを複数の値に対応させたい場合は、multimap を使用する必要があります

おすすめ

転載: blog.csdn.net/weixin_46025531/article/details/122797322