【C++の続き】C++コレクション - set/multisetクラス(Study16)


 =============================== 【説明】 ================ ===== ====================================
  皆さんこんにちは、このコラムは主に学びを目的としています。 C++ の内容は、このブロガーを私自身が学びました ホスト [ AI バクテリア ] の [C++ 21 日間栽培プラン] は 非常にわかりやすく、初心者に適しています。このブロガーにもっと注目、お気に入り、いいねを与えたいと思っています。
  学んだ内容を中心に、自分なりの理解をしながら整理し、積極的にコミュニケーションをとり、議論し、意見を出し合ってほしいと思います。また、その他の知識についても後ほど更新します。侵害がある場合は、削除するために連絡してください。一緒にネットワーク知識の権利を守りましょう!
 ================================================= == =============================================== ================================================= ================================================= =======================================
   _
  _ しかし、C++ をさらに詳しく学習すると、データ構造は次のようになります。必須の内容。 データ構造とアルゴリズムによって、 コードの格納方法とコードの実行効率が決まります。
  データ構造の重要性は自明のことであり、 データ構造に関する基本的な知識は、私の別のコラム ====> [ データ構造] に移すことができます ブロガー【 AI菌】さんの 【データ構造とアルゴリズム】も比較的わかりやすくて勉強になります!


1. コレクションクラス

1.1、コレクションクラスとは

集合  と言えば、私たちは数学で集合の概念を学びました。コレクションには、相互性(コレクション内の要素が異なる) と無秩序(要素の位置に順序関係がない) の 2 つの特性があります。

ここに画像の説明を挿入
  C++ では、STL クラスはカプセル化されており、従来のコレクションの概念とは異なります。コレクションには、set、multiset、unowned_set、unowned_multiset が含まれます。以下に、これら 4 つのコレクション クラスについて簡単に説明します。
  set : コレクション内の要素は順序付けされており、各要素は一意です
  multiset : コレクション内の要素は順序付けされており、各要素は一意ではありませんが、繰り返される場合があります。
  unowned_set : セット内の要素は順序付けされておらず、各要素は一意です
  unowned_multiset : セット内の要素は順序付けされておらず、各要素は一意ではなく、繰り返される可能性があります。
  全体として、set クラスと multiset クラスは順序付けされた要素のセットを格納するために使用され、検索の時間計算量は O(logn) です。unordered_set クラスと unowned_multiset クラスに格納された要素は順序付けされていないため、検索にかかる時間は長くなります。コレクション内の挿入要素は一貫しています (固定されています)。
  注:setとクラスを使用する場合はmultiset、ヘッダー ファイルを定義する必要があります。

#include <set>

1.2 メリットとデメリットは何ですか

  プログラムを頻繁に検索する必要がある場合、この 2 つsetmultisetクラスはソートおよび順序付けされているため、他のクラスよりも検索速度が速くなります
  具体的には: コレクションに要素を挿入するときに、find()関数を使用して並べ替えに適切な位置を見つけます。したがって、要素を追加 (挿入) する場合、間違いなく追加のオーバーヘッドが追加されますが、find() の内部実装ではバイナリ ツリー構造が使用されます。この構造の検索時間計算量は、多くの場合 O(logn) 程度です。しかし、
  いくつかの欠陥もありますこのクラスは前述のクラスほど優れていません。vector は指定された位置の要素を他の要素に置き換えることができ、クラスは新しい要素をバイナリ ツリー内の他の要素と比較します。別の位置に置きます。   全体として、クラスやサムと比較して:     長所:クラス内のバイナリ ツリー構造と同様に、検索速度が速い;短所     : 要素を追加する場合、少し余分なオーバーヘッドが追加される; 他の要素を使用して直接置き換えることはできない指定された位置にある要素。setmultisetvectorsetmultiset
setmultisetvector
setmultiset

1.3. コレクションクラスの基本操作

  set前のクラスと同様multiset、これはテンプレート クラスであり、最初にインスタンス化する必要があります。
  (1) 整数セットまたはマルチセットをインスタンス化します。

set <int> setNums;
multiset <int> msetNums;

  (2) Tina オブジェクトを含むセットまたはマルチセットを宣言します。

set <Tina> setNums;
multiset <Tina> msetNums;

  (3) コピーを使用して、セットまたはマルチセットをインスタンス化します。

set <int> setNums1(setNums);
multiset <int> msetNums1(msetNums);

  これら 3 つの方法では順序は指定されず、デフォルトは ascending ですコレクション要素の順序を指定したい場合は、事前に定義を宣言できます。

# 升序排序
set<int, less<int>>setNums;
# 降序排序
set<int, greater<int>>setNums;//greater<>是个函数,降序,所以要加这个头文件#include<functional>

2. コレクションクラスのメンバ関数

  コレクション クラスには、挿入、検索、削除などの独自のメンバー関数もあります。メンバー関数は多くの問題を解決し、コードをより簡潔にすることができます。

2.1、挿入関数 insert()

  setまたmultiset、クラスは関数を使用してコレクションに値を挿入できますinsert()

#include<iostream>
#include<set>

using namespace std;

template <typename T>
void DisplayContents(const T& Input)
{
    
    
    for(auto  iElement = Input.cbegin();iElement != Input.cend(); ++iElement)
        cout<<*iElement<<" ";
    cout<<endl;
}

int main()
{
    
    
     set <int> setIntegers;
     multiset <int> msetIntegers;

     setIntegers.insert(60);
     setIntegers.insert(-1);
     setIntegers.insert(300);

     cout<<"显示内容到屏幕:"<<endl;
     DisplayContents(setIntegers);

     msetIntegers.insert(setIntegers.begin(), setIntegers.end());
     msetIntegers.insert(300);

     cout<<"再插入一个元素后,显示内容到屏幕:"<<endl;
     DisplayContents(msetIntegers);

     cout<<"300的数量是:"<<msetIntegers.count(300)<<endl;
     return 0;
}

ここに画像の説明を挿入

2.2. 検索関数 find()

setおよびクラス  ではmultiset、メンバー関数を使用して、find()対応する要素を検索できます。ただし、マルチセットには同じ要素が複数含まれる場合があります。したがって、マルチセットの場合、find()関数は指定された value に一致する最初の要素を見つけます。

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

int main()
{
    
    
    set<int> setNums;

    //插入元素
    setNums.insert(50);
    setNums.insert(-48);
    setNums.insert(6);
    setNums.insert(160);

    //显示集合元素
    for (auto iElement=setNums.cbegin(); iElement != setNums.cend(); ++iElement)
        cout<<*iElement<<endl;

    //查找集合元素-1
    auto iElementFound = setNums.find(-1);
    if(iElementFound != setNums.end())
        cout<<"Element "<<*iElementFound<<" found!"<<endl;
    else
        cout<<"Element -1 not found in setNums!"<<endl;

    //查找集合元素6
    auto anotherFind = setNums.find(6);
    if(anotherFind != setNums.end())
        cout<<"Element "<<*anotherFind<<" found!"<<endl;
    else
        cout<<"Element 6 not found in setNums!"<<endl;

    return 0;
}

ここに画像の説明を挿入

2.3、関数erase()の削除

setおよびクラス  ではmultiset、他のテンプレート クラスと同様に、erase()関数を使用して要素を削除できます。

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

template <typename T>
void DisplayContents(const T& Input)
{
    
    
    for(auto  iElement = Input.cbegin();iElement != Input.cend(); ++iElement)
        cout<<*iElement<<" ";
    cout<<endl;
}


int main()
{
    
    
    multiset <int, greater<int>> msetNums;
    msetNums.insert(46);
    msetNums.insert(78);
    msetNums.insert(-100);
    msetNums.insert(-100);
    msetNums.insert(8);

    cout<<"msetNums 包含 "<<msetNums.size()<<" 个元素"<<endl;
    cout<<"降序显示mseNums全部元素:"<<endl;
    DisplayContents(msetNums);

    msetNums.erase(-100);

    cout<<"删除-100后,显示mseNums全部元素:"<<endl;
    DisplayContents(msetNums);

    return 0;
}

ここに画像の説明を挿入

3. その他

3.1、注意点

  (1)setコンテナーはmultiset頻繁な検索用に最適化されています;
  (2)multiset同じ値を持つ複数の要素を格納できますが、set異なる値のみを格納できます。
  (3) ユーザはcount()特性値を含む要素の数を取得できます;
  (4) ユーザはsize()集合に含まれる要素の数を取得できます。
  (5)挿入が頻繁で検索がほとんど必要ない状況では、を使用しないでくださいこの場合は、ベクトルとリストを使用する方が適切です。setmultiset

4. まとめ

  最後に、長い話を簡単に言うと、この本を読んだ後、皆さんも実践してください。3 分間暑くならないこと、3 日間釣りをすること、2 日間ネットに投稿することを覚えておいてください。また、普段の学習の進捗を記録するために自分でブログを書いてみたり、インターネット上で多くの学者とコミュニケーションやディスカッションをしたりすることもできます。冒頭で紹介したブロガー【AI細菌】さんが個人的にフォローしたり、関連コラムを購読したりしているので(参考になります)、良いと思ったらいいね、フォロー、ブックマークしていただけると幸いです。

おすすめ

転載: blog.csdn.net/qq_41225961/article/details/127665598