C++ STLのコレクションセットの詳細説明

Part.I 注意点

ここに画像の説明を挿入

使用set上の注意点:

  • 引用を追加#include <set>
  • mapコンテナーとは異なりmultimapsetコンテナーに格納される各キーと値のペアでは、キーkeyと値がvalue等しい必要があります。
  • 連想コンテナset(コレクション) 内の要素は一意であり、システムはそれらの値に従って自動的に並べ替えます。
  • C++ STL の標準の連想コンテナは、set, multiset, map, multimap非常に効率的なバランス検索バイナリ ツリーである赤黒ツリー (RB ツリー (赤黒ツリー) とも呼ばれます) を使用します。

公式サイト: https: //cplusplus.com/reference/set/

第Ⅱ部 機能

第I章 ヘッダファイルに関数を設定する

セット内でよく使用される関数を次の図に示します。

ここに画像の説明を挿入
これらの関数の意味を説明した表を以下に示します。

関数 意味
begin() コンテナ内の最初の要素 (最初にソートされたことに注意してください) を指す双方向イテレータを返します。セットコンテナが const 修飾されている場合、このメソッドは const 型の双方向反復子を返します。
end() コンテナの最後の要素 (ソートされた最後の要素であることに注意してください)後の位置を指す双方向イテレータを返します。通常begin()は と組み合わせて使用​​されます。セットコンテナが const 修飾されている場合、このメソッドは const 型の双方向反復子を返します。
rbegin() 最後の (注、最後にソートされた) 要素を指す逆双方向反復子を返します。セットコンテナが const 修飾されている場合、このメソッドは const 型の逆双方向反復子を返します。
rend() 最初の (最初にソートされたことに注意してください) 要素の位置より前の位置を指す逆双方向反復子を返します。セットコンテナが const 修飾されている場合、このメソッドは const 型の逆双方向反復子を返します。
cbegin() これはbegin()と同じ機能を持ちますが、その上に const 属性が追加される点が異なります。この属性を使用してコンテナに格納されている要素値を変更することはできません。
cend() これはend()と同じ機能を持ちますが、その上に const 属性が追加される点が異なります。この属性を使用してコンテナに格納されている要素値を変更することはできません。
crbegin() これはrbegin()と同じ機能を持ちますが、その上に const 属性が追加される点が異なります。この属性を使用してコンテナに格納されている要素値を変更することはできません。
crend() これはrend()と同じ機能を持ちますが、その上に const 属性が追加される点が異なります。この属性を使用してコンテナに格納されている要素値を変更することはできません。
find(val) set コンテナー内で値が val である要素を探し、正常に見つかった場合は、その要素を指す双方向反復子を返し、それ以外の場合は、end()メソッドと同じ反復子を返します。さらに、セットコンテナが const 修飾されている場合、このメソッドは const 型の双方向イテレータを返します。
lower_bound(val) 現在のセットコンテナ内の val 以上の最初の要素を指す双方向反復子を返します。セットコンテナが const 修飾されている場合、このメソッドは const 型の双方向反復子を返します。
upper_bound(val) 現在のセットコンテナ内の val より大きい最初の要素を指す反復子を返します。セットコンテナが const 修飾されている場合、このメソッドは const 型の双方向反復子を返します。
equal_range(val) このメソッドはペア オブジェクト (2 つの双方向反復子を含む) を返します。ここで、pair.firstとメソッドlower_bound()の戻り値は同等でありpair.secondupper_bound()メソッドの戻り値も同等です。つまり、このメソッドは、値 val を持つ要素を含む範囲を返します (セット コンテナ内の各要素は一意であるため、範囲には最大 1 つの要素が含まれます)。
empty() コンテナが空の場合は true を返し、それ以外の場合は false を返します。
size() 現在のセットコンテナに格納されている要素の数を返します。
max_size() セット コンテナが保持できる要素の最大数を返します。オペレーティング システムが異なると、戻り値も異なります。
insert() 要素をセットコンテナに挿入します。
erase() セットコンテナに格納されている要素を削除します。
swap() 2 つのセット コンテナに格納されているすべての要素を交換します。これは、操作される 2 つのセットのコンテナが同じタイプである必要があることを意味します。
clear() セット コンテナ内のすべての要素をクリアします。つまり、セット コンテナはsize()0 になります。
emplace() 現在のセットコンテナ内の指定された位置に新しい要素を直接構築します。その効果は insert() と同じですが、より効率的です。
emplace_hint() 本質的には、emplace()セット コンテナー内に新しい要素を構築するメソッドと同じですが、ユーザーがこのメソッドに新しい要素が生成される位置を示す反復子をメソッドの最初のパラメーターとして提供する必要がある点が異なります。
count(val) 現在のセットコンテナ内で、値が val である要素の数を見つけて返します。set コンテナ内の各要素の値は一意であるため、この関数の最大戻り値は 1 であることに注意してください。

第Ⅱ章アルゴリズムの関数

ヘッダー ファイルには#include <algorithm>、交​​差、和集合、差分などの集合に関連する演算があります。

  • set_intersection: テイクセット交差点
  • set_union: フェッチとユニオン
  • set_difference: セット差分を取る
  • set_symmetric_difference: 設定された対称差分を取得します。

これらの関数の使い方はほぼ同じです. パラメータはすべて 5 つあります. 最初の 4 つのパラメータの意味は同じです. 5 番目のパラメータは 2 種類あります. 以下を例に挙げますset_union():

  • set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(C1 , C1.begin()));
  • set_union(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator(cout," “));

最初の 4 つのパラメータのうち最初の 2 つのパラメータはセットAの合計です。3 番目と 4 番目のパラメータはセットの合計です。最初の使用法の意味は、セットに結合の結果を格納することであり、2 番目の使用法の意味は使用法は、結合結果の出力を格納することです。begin()end()Bbegin()end()C1


さらに、aboutsetおよびvector相互変換は次のように実行できます。

vector<int> v;
v = {
    
    1,2,2,3,3,4};					//建立vector
set<int> st(v.begin(), v.end());	//在构造函数中可以直接实现vector转set
v.assign(st.begin(), st.end());		//用assign实现set转vector

Part.III コード

LeetCode の問題 2032 。少なくとも 2 つの配列に現れる値がsetこれに非常に適しています。C++解決策は次のとおりです。

class Solution {
    
    
public:
    vector<int> twoOutOfThree(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3) {
    
    
        set<int> s1(nums1.begin(),nums1.end()), s2(nums2.begin(),nums2.end()), s3(nums3.begin(),nums3.end()), s12,s13,s23;
        set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s12, s12.begin() ));
        set_intersection(s1.begin(),s1.end(),s3.begin(),s3.end(),inserter(s12, s12.end() ));
        set_intersection(s2.begin(),s2.end(),s3.begin(),s3.end(),inserter(s12, s12.end() ));
        vector<int> ans;
        ans.assign(s12.begin(), s12.end());
        return ans;
    }
};

おすすめ

転載: blog.csdn.net/Gou_Hailong/article/details/128398866