C ++オブジェクト指向プログラミングの研究ノート(9)

ペアマップセット

STLのペア

(1)ペアで定義されています

ヘッダファイル <utility>
STLの 要素のバイナリまたはグループを表すために、ヘッダファイルルックス非常に単純なテンプレートクラス対に記載の辞書式順序の比較演算が実行中で素子サイズにテンプレート機能を提供しました。

ペアのオブジェクトは、平面座標の点を表す定義:
例:

pair<double, double> p;
cin >> p.first >> p.second;

若しくは

pair <string,double> product1 ("tomatoes",3.25);

最初の要素のデータ型と尾部要素:一対のテンプレートクラスは、2つのパラメータを必要とします。第一及び第二の、それぞれ最初の要素及び最後の要素:一対のテンプレートクラスオブジェクトは、二つの部材を有しています。

例:

pair<int,int>p1;
    pair<int,int>p2;
    cin>>p1.first>>p1.second;
    cin>>p2.first>>p2.second;
    cout<<'<'<<p1.first<<','<<p1.second<<'>'<<endl;
    cout<<'<'<<p2.first<<','<<p2.second<<'>'<<endl;

出力
<p1.first、p1.second>
<p2.first、p2.second>

の比較(2)対

<utility>6つの比較演算子のペアで定義されています。<、>、<= 、> =、==、=、 それはよりそのルールの最初のです!
まず、最初に等しい時間より次いで第2の比較、ほとんどのアプリケーションに沿って、ロジック。もちろん、これらは、オペレータによってオーバーロードされ得る
比較ロジックから⼰再割り当てします。

例:

 if(p1>p2) cout<<"p1"<<endl;
    else if(p2>p1) cout<<"p2"<<endl;
    else cout<<"equal"<<endl;

(3)ペアはオンザフライで生成されます

直接ペアのオブジェクトを定義することに加えて、あなたは、オブジェクトが、あなたも呼び出すことができる場合はすぐにペアを生成する必要が<utility>与えられ
make_pair:テンプレート関数の意味を。make_pairは、それぞれ、第一の要素及び要素の最後の要素を2つのパラメータを必要とします。
例:

pair <string,double> product3;
product3 = make_pair ("shoes",20.0);
cout <<"The price of "<< product3.first <<" is $"<< product3.second <<"\n";

出力:
靴のは、IS $ 20.0価格。

注:
一般的なmake_pairパラメータは位置の必要なペアを作るために使用されている、あなたは直接のペアのオブジェクトを生成make_pair呼び出すことができます。
別の態様は、より高い柔軟性を得ることができるように、対に許容される暗黙の型変換を使用することです。しかし、このような問題が発生する:
たとえば、次の2つの定義を:

   std::pair<int, float>(1, 1.1);
        std::make_pair(1, 1.1);

第2の変数の最初のfloat型、秒make_pair機能であろうあるリンクの説明を追加変数が二重に変換されるOND。
この問題は、注意が必要なプログラミングです。

STLセット

以下からの引用C ++設定の詳細な使用方法

定義の(1)セット:

ヘッダ<set>
セットには、それはセット連想コンテナを言わなければなりません。データセットからの同じデータ型のデータ型を格納するための容器、及び取り出しデータとして設定され、各要素の値は一意であるが、システムが自動的にセット内の要素の値に従ってソートすることができます。集合の要素数の値を直接変更することができないことに留意すべきです。非常に効率的に使用する内部容器セット、マルチセット、マップ、マルチマップに関連付けられた標準C ++ STLは、二分木検索をバランスさ:赤黒木、木になったRB(赤黒木)。RBの木統計的性能は、その一般的にバランスバイナリツリーよりも優れている、それがSTL関連する容器の内部構造として選択しました。
設定オブジェクトを定義します。

set<int> s;
set<double> ss;

(2)基本的な操作のセット。

s.begin()       // 返回指向第一个元素的迭代器
s.clear()       // 清除所有元素
s.count()       // 返回某个值元素的个数
s.empty()       // 如果集合为空,返回true(真)
s.end()         // 返回指向最后一个元素之后的迭代器,不是最后一个元素
s.equal_range()  // 返回集合中与给定值相等的上下限的两个迭代器
s.erase()       // 删除集合中的元素
s.find()        // 返回一个指向被查找到元素的迭代器
s.get_allocator() // 返回集合的分配器
s.insert()       // 在集合中插入元素
s.lower_bound()  // 返回指向大于(或等于)某值的第一个元素的迭代器
s.key_comp()    // 返回一个用于元素间值比较的函数
s.max_size()    // 返回集合能容纳的元素的最大限值
s.rbegin()       // 返回指向集合中最后一个元素的反向迭代器
s.rend()         // 返回指向集合中第一个元素的反向迭代器
s.size()        // 集合中元素的数目
s.swap()         // 交换两个集合变量
s.upper_bound()      // 返回大于某个值元素的迭代器
s.value_comp()  // 返回一个用于比较元素间的值的函数

例:

#include <iostream>
#include <set>
 
using namespace std;
 set<int>s;
    s.insert(1);
    s.insert(2);
    s.insert(4);
    s.insert(0);
    cout<<"set 的 size 值为 :"<<s.size()<<endl;
    cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
    cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
     cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
     if(s.empty())
     {
         cout<<"set 为空 !!!"<<endl;
     }
     else cout<<"set 的 size 值为 :"<<s.size()<<endl;
     s.clear();
     if(s.empty())
     {
         cout<<"set 为空 !!!"<<endl;
     }
     else cout<<"set 的 size 值为 :"<<s.size()<<endl;
     cout<<"set 的 size 值为 :"<<s.size()<<endl;
     cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
     return 0;
}

動作結果
サイズ値:. 4の設定
値のMAXSIZEセット:214748364の
このセット内の最初の要素は0
組の最後の要素である:. 4
サイズ値のセット:. 4
セットが空であります!
サイズが設定されている:0
値のMAXSIZEセット:214748364

rbegin()とrend()は、

イテレータ
リバースイテレータ

リバースイテレータは、コンテナを反転反復トラバーサルです。すなわち、最後の要素から容器を横断する第一の要素に、です。反復子がインクリメント(および減少)ターンの意味であろう逆:前の要素への逆イテレータ++オペレータアクセスの場合、および - 次の要素がアクセスされる計算。

容器Cの最初の要素を指していることをイテレータ)(返信.begin
.END()は容器Cの最後の要素の次の位置を指すイテレータ、戻り
.rbegin()は、逆反復子を返しは容器Cの最後の要素を指して
)上述.rendする(容器Cの位置の最初の要素を指していることを逆イテレータを返します

後進レンジを示すイテレータ、および範囲が示されているが、非対称であり、このことは重要な結論を導き出すことができる:==逆方向共通に使用する場合、イテレータイテレータは、得られた反復を初期化するか、割り当てることこれは、元のイテレータポイントの要素をポイントしません。==

セットトラバーサル

#include<cstdio>  
#include<set>  
using namespace std;  
int main()  
{  
    set<int>s;  
    s.insert(3);   
    s.insert(1);  
    s.insert(2);  
    s.insert(1);  
    set<int>::iterator it;              
    for(it=s.begin();it!=s.end();it++)  //使用迭代器进行遍历   
    {  
        printf("%d\n",*it);  
    }  
    return 0;  
}  
//输出结果 : 1 2 3     一共插入了4个数,但是集合中只有3个数并且是有序的,可见之前说过的set集合的两个特点,有序和不重复。

概要:また始めるNOTE()とend()関数は、セットが空であるかどうかをチェックしません、それはセットが空であるかどうかを確認するために、空の()のチェックを使用する前に、使用することをお勧めします。

### カウント()

表示されるキーのセットで番号を検索するために使用。キーの値は、それが前にセットのキー値があるかどうかの判断になりそうという、唯一のセット0または1で表示される場合がありますので、この機能は、セットで非常に実用的ではありません。
例:

#include <iostream>
#include <set>
 
using namespace std;
 
int main(){
     set<int> s;
     s.insert(1);
     s.insert(2);
     s.insert(3);
     s.insert(1);
     cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;
     cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;
     return 0;
}

結果
セット内の数字1が表示されますがあります:1
セットでの時間は、4つの発生している:0

equal_range()

ロケータの復帰に失敗した場合に戻るロケータの対、最初の要素がより大きい又は所定のキー値と所定の臨界値よりも第1の要素も大きいと等しい表し、戻り値は、ペア型であります、終了()の値に等しくなります。
例:

#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<int>s;
    set<int>::iterator ter;
    for(int i=1;i<5;i++)
        s.insert(i);
     pair<set<int>::const_iterator,set<int>::const_iterator> pr;
     pr = s.equal_range(3);
     cout<<"第一个大于等于 3 的数是 :"<<*pr.first<<endl;
     cout<<"第一个大于 3的数是 : "<<*pr.second<<endl;
    return 0;
}

結果
3に等しい数以上のは、次のとおり3
最初の数字は3よりも大きい:4

消去()

ERASE(イテレータ)は、ロケータポイントイテレータ値削除
ERASE(第一、第二)、第1のリテーナとSECONDの値削除
ERASE(KEY_VALUE)をキーKEY_VALUEの値を削除し、
例:

#include <iostream>
#include <set>

using namespace std;

int main(){
     set<int> s;
     set<int>::const_iterator iter;
     set<int>::iterator first;
     set<int>::iterator second;
     for(int i = 1 ; i <= 10 ; ++i)
     {
         s.insert(i);
     }
     for(iter = s.begin() ; iter != s.end() ; ++iter)
     {
         cout<<*iter<<" ";
     }
     cout<<endl;
     //第一种删除
     s.erase(s.begin());
     //第二种删除
     first=s.begin();
     second=s.begin();
     second++;
     second++;
     s.erase(first,second);
     //第三种删除
     s.erase(8);
    cout<<"删除后 set 中元素是 :"<<endl;
     for(iter = s.begin() ; iter != s.end() ; ++iter)
     {
         cout<<*iter<<" ";
     }
     cout<<endl;
    return 0;
}

結果:
12345678910
削除する要素の後には、設定されます。
4567910

概要:削除操作は、など、そのようなポジショナの合法性として、エラーチェック、のいずれかに設定されていないので、時間が自分自身の使用に注意を払う必要があります。

インサート()

INSERT(KEY_VALUE)
セットに挿入KEY_VALUE、戻り値はペア<集合であります ::イテレータ、ブール> BOOLマーク挿入が成功し、そしてKEY_VALUEが設定されている場合、反復子は、挿入位置を示し、その後イテレータKEY_VALUEは、一連の位置で表しました。
(第一、第二)からのインセット
の最初の要素への位置決めは、戻り値は無効である第二のセットとの間に挿入されている。
例:

#include <iostream>
#include <set>

using namespace std;

int main()
{
     int a[] = {1,2,3};
     int t;
     set<int> s;
     set<int>::iterator iter;
     s.insert(a,a+3);
     for(iter = s.begin() ; iter != s.end() ; ++iter)
     {
         cout<<*iter<<" ";
     }
     cout<<endl;
     pair<set<int>::iterator,bool> pr;
     cin>>t;
     pr = s.insert(t);
     if(!pr.second)
     {
         cout<<"error"<<endl;
     }
     for(iter = s.begin() ; iter != s.end() ; ++iter)
     {
         cout<<*iter<<" ";
     }
     cout<<endl;
     return 0;
}

LOWER_BOUND && UPPER_BOUND

LOWER_BOUND(KEY_VALUE) 以上でKEY_VALUE戻る第ロケータ
UPPER_BOUND、(KEY_VALUE)は、最後のロケータが等しいKEY_VALUEより大きい戻り
例:


#include <iostream>
#include <set>
 
using namespace std;
 
int main()
{
     set<int> s;
     s.insert(1);
     s.insert(3);
     s.insert(4);
     cout<<*s.lower_bound(2)<<endl;
     cout<<*s.lower_bound(3)<<endl;
     cout<<*s.upper_bound(3)<<endl;
     return 0;
}

結果:
3
3
4

.find()

検索(キー)関数は、キーのキー要素の位置に戻され、戻り値はイテレータ型である

#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<int>s;
    for(int i=0;i<10;i++)
        s.insert(i);
    set<int>::iterator it1=s.find(4);
    set<int>::iterator it2=s.find(11);
    if(it1!=s.end())
        cout<<*(it1)<<endl;
    else cout<<"error"<<endl;
    if(it2!=s.end())
        cout<<*(it2)<<endl;
    else cout<<"error"<<endl;
    return 0;
}

結果
4
エラーを

。スワップ()

交換の二組の

#include <iostream>
#include <set>
using namespace std;

int main()
{
    set<int>s1;
    set<int>s2;
    for(int i=0;i<10;i++)
        s1.insert(i);
    for(int i=10;i<15;i++)
        s2.insert(i);
    cout<<"s1:";
    for(set<int>::iterator it =s1.begin();it!=s1.end();it++)
        cout<<*(it)<<" ";
    cout<<endl;
    cout<<"s2:";
    for(set<int>::iterator it =s2.begin();it!=s2.end();it++)
        cout<<*(it)<<" ";
    cout<<endl;
    s1.swap(s2);//进行交换
    cout<<"s1:";
    for(set<int>::iterator it =s1.begin();it!=s1.end();it++)
        cout<<*(it)<<" ";
    cout<<endl;
    cout<<"s2:";
    for(set<int>::iterator it =s2.begin();it!=s2.end();it++)
        cout<<*(it)<<" ";
    cout<<endl;
    return 0;
}

結果
S1:2. 3. 1 0 4 5 6 7 8 9
S2:12は、13である14 10 11である
12 13 14 10 11である:S1
0 5 4 3 2 1 6 7 8 9:S2

key_comp()。value_comp()

二つのセット使用中の機能の種類と同じ
、しかしリターンの異なるタイプ
key_comp()型key_compareのある
(value_comp)型value_compareのある

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
int main()
{
    set<double>s;
    for(int i=0;i<10;i++)
        s.insert(i);
    set<double>::key_compare kc1=s.key_comp();
    cout<<"s1:"<<endl;
    for(set<double>::iterator it=s.begin();it!=s.end();it++)
      {
          cout<<*(it)<<" ";
          if(kc1(7,*(it))==true) break;
      }
    cout<<endl;
    return 0;
}

結果
S1:
0 5 4 3 2 1 8 6 7

カスタム比較関数

(1)要素が構造ではありません。


//カスタム比較関数MYCOMP、過負荷「()」演算子

struct myComp  
{  
    bool operator()(const your_type &a,const your_type &b)  
    {  
        return a.data-b.data>0;  
    }  
}  
set<int,myComp>s;  
......  
set<int,myComp>::iterator it;  
要素は、構造(2)である場合、比較関数は、構造体に直接書き込むことができます。

struct Info  
{  
    string name;  
    float score;  
    //重载“<”操作符,自定义排序规则  
    bool operator < (const Info &a) const  
    {  
        //按score从大到小排列  
        return a.score<score;  
    }  
}  
set<Info> s;  
......  
set<Info>::iterator it;  

#include<stdio.h>  
#include<set>  
#include<string>  
using namespace std;  
struct People  
{  
    string name;  
    int age;  
    bool operator <(const People p) const  //运算符重载   
    {  
        return age<p.age;       //按照年龄由小到大进行排序   
    }  
};   
int main()  
{     
    set<People>s;  
    s.insert((People){"张三",14});  
    s.insert((People){"李四",16});  
    s.insert((People){"王二麻子",10});  
    set<People>::iterator it;              
    for(it=s.begin();it!=s.end();it++)  //使用迭代器进行遍历   
    {  
        printf("姓名:%s 年龄:%d\n",(*it).name.c_str(),(*it).age);  
    }  
    return 0;  
}  

結果
名前:王麻子年齢:10
名:ジョー・スミス年齢:14
名:ジョン・ドウ年齢:16

マルチセットは、キーワードデータファイルを有する容器の別のタイプは同じ値であり、セットの異なる、重複要素セットを含んでいてもよく、その使用方法も同様です。

マップについて

STLのヘッダファイルに<map>型記憶規則正しいバイナリツリーテーブルを用いて、テンプレートクラスマップおよびマルチマップを定義した
配列要素<キー、T CONST>ペア。主な要素constのシーケンスは、キー内のすべての要素をマッピングする、の一部として識別されている
値は一意である必要があり、マルチマップのキー値の重複が許可されています。
それがキー値に応じてコンテナ要素を見つける必要が適しているので、マップは、アイデンティティの重要な要素は、このような容器はまたすぐにキーによって要素の値を決定することができ、「連想コンテナ」として知られている要素の集合と見なすことができます。
最初のものは、キータイプ、第二の要素型である地図テンプレートクラステンプレートは、4つのパラメータを必要とする、第三は、比較演算子、第4のタイプのディスペンサーです。どのキータイプおよび要素タイプが必要です。

マップオブジェクトの定義:

例:

map<string, int> m;

マップの基本的な操作:

/* 向map中插入元素 */
m[key] = value; // [key]操作是map很有特色的操作,如果在map中存在键值为
key的元素对, 则返回该元素对的值域部分,否则将会创建一个键值为key的元素对,值域为默认值。
所以可以用该操作向map中插入元素对或修改已经存在的元素对的值域部分。
m.insert(make_pair(key, value)); // 也可以直接调用insert方法插入元素对,insert操作会返回一个pair,当map中没有与key相匹配的键值时,其first是指向插入元素对的迭代器,其second为true;若map中已经存在与key相等的键值时,其first是指向该元素对的迭代器,second为false。
/* 查找元素 */
int i = m[key]; // 要注意的是,当与该键值相匹配的元素对不存在时,会创建键值为key(当另一个元素是整形时,m[key]=0)的元素对。
map<string, int>::iterator it = m.find(key); // 如果map中存在与key相匹配的键值时,find操作将返
回指向该元素对的迭代器,否则,返回的迭代器等于map的end()。
/* 删除元素 */
m.erase(key); // 删除与指定key键值相匹配的元素对,并返回被删除的元素的个数。
m.erase(it); // 删除由迭代器it所指定的元素对,并返回指向下一个元素对的迭代器。
/* 其他操作 */
m.size(); // 返回元素个数
m.empty(); // 判断是否为空
m.clear(); // 清空所有元素

例:

#include<iostream>
#include<cstdio>
#include<map>
#include<utility>
using namespace std;
typedef pair<int,int>mypair;
int main()
{
    map<int,int>m;
    if(m.empty()) cout<<"empty"<<endl;
    else cout<<"m.size:"<<m.size()<<endl;
    m[1]=2;
    cout<<"m1:"<<m[1]<<endl;
    cout<<"m.size:"<<m.size()<<endl;
    /*
    cout<<m[3]<<endl;
    m.insert(mypair(3,6));
    cout<<m[3]<<endl;
    */  //插入失败
    m.insert(mypair(3,6));
    cout<<"m3:"<<m[3]<<endl;
    map<int,int>::iterator it1;
    pair<int,int>temp;
    it1=m.find(3);
    temp=*(it1);
    cout<<"m3.key:"<< temp.first <<" m3.value:"<<temp.second<<endl;
    m.erase(3);
    cout<<"m3:"<<m[3]<<endl;
    it1=m.find(1);
    m.erase(it1);
    cout<<"m1:"<<m[1]<<endl;
    cout<<"m.size:"<<m.size()<<endl;
    if(m.empty()) cout<<"empty"<<endl;
    else cout<<"m.size:"<<m.size()<<endl;
    m.clear();
    if(m.empty()) cout<<"empty"<<endl;
    else cout<<"m.size:"<<m.size()<<endl;
    return 0;
}

その他の動作はの地図

(1)
コンストラクタ リマーク
C / Cマルチマップをマップ 空のマップを生成したり、マルチマップ、いずれかの要因が含まれていません
フォルダC(AT)/ MultimapはCの(で) オペアンプは、ソート基準にある空のマップ/マルチマップを作成します
地図C1(C2)/マルチマップC1(C2) マップ/マルチマップオブジェクトのコピーを作る、すべての要素がコピーされます
マップC(BEG、エンド)/マルチマップC(BEG、終了) 新しいマップ/マルチマップを生成する部分(BEG、端部)の要素で
マップC(BEG、終了、OP)/マルチマップC(BEG、終了、OP) 新しいマップ/マルチマップを生成する部分(BEG、端部)の要素、OPのランキング基準に
地図 効果
マップ<キー、Elemの> 発注基準の<>以下で
マップ<キー、Elemの、OP> オペアンプは、基準をソートすることです
同様に、マルチマップ

#include <iostream>
#include<map>
using namespace std;
typedef pair<int,double> CustomPair;
int main()
{
    map<int,double> m1;
    map<int,double,greater<int> >m2;
    map<int,double>::iterator it1;
    map<int,double,greater<int> >::iterator it2;
    m1.insert(CustomPair(1,2.0));
    m1.insert(CustomPair(2,3.0));
    m1.insert(CustomPair(3,4.0));
    cout<<"m1:"<<endl;
    for(it1=m1.begin();it1!=m1.end();it1++)
    {
        CustomPair p1=(pair<int,double>)(*it1);
        cout<<p1.first<<", ";
        cout<<std::fixed<<cout.precision(2)<<p1.second<<"; "<<endl;
    }
    m2.insert(CustomPair(1,2.0));
    m2.insert(CustomPair(2,3.0));
    m2.insert(CustomPair(3,4.0));
    cout<<"m2:"<<endl;
    for(it2=m2.begin();it2!=m2.end();it2++)
    {
        CustomPair p2=(pair<int,double>)(*it2);
        cout<<p2.first<<", ";
        cout<<std::fixed<<cout.precision(2)<<p2.second<<"; "<<endl;
    }
    return 0;
}

結果:
M1:
1、62.00;
2、23.00;
3、24.00;
M2:
3、24.00;
2、23.00;
1、22.00;。

(2)

MAX_SIZE();最大容量の出力
例:


int main()
{
    map<int,int>m;
    cout<<"max_size="<<m.max_size()<<endl;
    return 0;
}

結果:
MAX_SIZE = 178956970

(3)ランダムアクセスの数をカウント

()を数える;
機能:戻り値は、要素の数がマップに表示されます。

UPPER_BOUND()、LOWER_BOUND();
機能:
戻り値のUPPER_BOUND、(キー)は反復子が重要な要素に向けより大きい; LOWER_BOUND()戻り値へのポインタを返すイテレータフロントキー要素です。
例:

#include <iostream>
#include<map>
#include<algorithm>
using namespace std;
typedef pair<int,double> CustomPair;
int main()
{
    map<int,double> m1;
    map<int,double,greater<int> >m2;
    map<int,double>::iterator it1;
    map<int,double,greater<int> >::iterator it2;
    CustomPair temp;
    m1.insert(CustomPair(1,2.0));
    m1.insert(CustomPair(2,3.0));
    m1.insert(CustomPair(3,4.0));
    cout<<"m1:"<<endl;
    for(it1=m1.begin();it1!=m1.end();it1++)
    {
        CustomPair p1=(pair<int,double>)(*it1);
        cout<<p1.first<<", ";
        cout<<std::fixed<<cout.precision(2)<<p1.second<<"; "<<endl;
    }
    m2.insert(CustomPair(1,2.0));
    m2.insert(CustomPair(2,3.0));
    m2.insert(CustomPair(3,4.0));
    cout<<"m2:"<<endl;
    for(it2=m2.begin();it2!=m2.end();it2++)
    {
        CustomPair p2=(pair<int,double>)(*it2);
        cout<<p2.first<<", ";
        cout<<std::fixed<<cout.precision(2)<<p2.second<<"; "<<endl;
    }
    cout<<"1 in m1="<<m1.count(1)<<endl;
    it1=m1.upper_bound(2);
    temp=*it1;
    cout<<"upper_bound(2)--->"<<temp.first<<","<<temp.second<<endl;
    it1=m1.lower_bound(2);
    temp=*it1;
    cout<<"lower_bound(2)--->"<<temp.first<<","<<temp.second<<endl;
    return 0;
}

结果:
M1:
1 62.00
2 23.00
3、24.00
M2:
3、24.00
2 23.00
1、22.00
M1 = 1で1
UPPER_BOUND(2)---> 3,4.00
LOWER_BOUND(2)---> 2、 3.00

おすすめ

転載: www.cnblogs.com/springfield-psk/p/12080965.html