セットする:
- セット連想コンテナ(セットのキーと値が同じであることを除いて、マップと同じ)。は同じデータ型のデータ型を格納するためのコンテナとして設定され、セット内の各要素の値は一意ですが、システムはもちろん要素の値(デフォルトは小から大)に従って自動的に並べ替えることができますまた、自己定義する順序を定義します。
セットアクセスデータとマルチセットアクセスデータはどちらもlog(n)であり、並べ替えもlog(n)です。
ヘッダーファイルは#include <set>
-
セット内の数値要素の値を直接変更することはできないことに注意してください。
-
C ++ STLの標準の連想コンテナセット、マルチセット、マップ、およびマルチマップは、非常に効率的なバランス検索バイナリツリーを使用します。赤黒木はRBツリー(赤黒木)とも呼ばれます。RBツリーの統計的パフォーマンスは、一般的な平衡二分木よりも優れているため、STLによって連想コンテナの内部構造として選択されます。
共通API
begin()--返回指向第一个元素的迭代器
clear()--清除所有元素
count()--返回某个值元素的个数
empty()--如果集合为空,返回true
end()--返回指向最后一个元素的迭代器
equal_range()--返回集合中与给定值相等的上下限的两个迭代器
erase()--删除集合中的元素
find()--返回一个指向被查找到元素的迭代器,否则,返回最后一个元素后面一个位置。
get_allocator()--返回集合的分配器
insert()--在集合中插入元素
lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()--返回一个用于元素间值比较的函数
max_size()--返回集合能容纳的元素的最大限值
rbegin()--返回指向集合中最后一个元素的反向迭代器
rend()--返回指向集合中第一个元素的反向迭代器
size()--集合中元素的数目
swap()--交换两个集合变量
upper_bound()--返回大于某个值元素的迭代器
value_comp()--返回一个用于比较元素间的值的函数
ここでは、集合内の共通部分と補集合の操作に焦点を当てます
set_intersection(テイクセット交差)、set_union(テイクセットユニオン)、set_difference(テイクセット差)、set_symmetric_difference(テイクセット対称差セット)などの関数があります。その中で、関数の5つのパラメーターについて要約します。
-
これらの関数の最初の4つのパラメーターは同じであり、5番目のパラメーターのみに複数のバージョンがあります。
-
set_union(A.begin()、A.end()、B.begin()、B.end()、inserter(C1、C1.begin()));最初の4つのパラメーターは、の最初のセットの先頭です。 2番目のセットの尻尾、頭と尻尾を回します。5番目のパラメーターは、コレクションAおよびBの結果をコレクションCに保管することを意味します。
-
set_union(A.begin()、A.end()、B.begin()、B.end()、ostream_iterator(cout、 ""));ここでの5番目のパラメーターは、AとBを組み合わせるという意味です。次の結果が出力されます。直接、二重引用符内の(cout、 "")は、コレクション要素を区切るために使用する記号またはスペースです。
コード:
/*Description
集合的运算就是用给定的集合去指定新的集合。设A和B是集合,则它们的并差交补集分别定义如下:
A∪B={
x|x∈A∨x∈B}
A∩B={
x|x∈A∧x∈B}
A-B={
x|x∈A∧x不属于 B}
SA ={
x|x∈(A∪B)∧x 不属于A}
SB ={
x|x∈(A∪B)∧x 不属于B}
<!--[endif]-->
Input
第一行输入一个正整数T,表示总共有T组测试数据。(T<=200)
然后下面有2T行,每一行都有n+1个数字,其中第一个数字是n(0<=n<=100),表示该行后面还有n个数字输入。
Output
对于每组测试数据,首先输出测试数据序号,”Case #.NO”,
接下来输出共7行,每行都是一个集合,
前2行分别输出集合A、B,接下5行来分别输出集合A、B的并(A u B)、交(A n B)、差(A – B)、补。
集合中的元素用“{
}”扩起来,且元素之间用“, ”隔开。
Sample Input
1
4 1 2 3 1
0
Sample Output
Case# 1:
A = {
1, 2, 3}
B = {
}
A u B = {
1, 2, 3}
A n B = {
}
A - B = {
1, 2, 3}
SA = {
}
SB = {
1, 2, 3}
*/
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
set<int>A;
set<int>B;
set<int>C1;
set<int>C2;
set<int>C3;
set<int>C4;
set<int>C5;
set<int>C6;
set<int>::iterator pos;/// 定义迭代器,作用是输出set元素
int count=0;
int A_i,B_i,n,m;
cin>>n;
while(n--)
{
count++;
cin>>A_i;
while(A_i--)///输入集合A
{
cin>>m;
A.insert(m);
}
cin>>B_i;///输入集合B
while(B_i--)
{
cin>>m;
B.insert(m);
}
cout<<"Case# "<<count<<":"<<endl;
cout<<"A = {";
for(pos=A.begin(); pos!=A.end(); pos++)///迭代器的作用
{
if(pos!=A.begin())cout<<", ";
cout<<*pos;///迭代器的作用,迭代器是一种特殊的指针
}
cout<<"}"<<endl;
cout<<"B = {";
for(pos=B.begin(); pos!=B.end(); pos++)
{
if(pos!=B.begin())cout<<", ";
cout<<*pos;
}
cout<<"}"<<endl;
set_union(A.begin(),A.end(),B.begin(),B.end(),inserter( A , A.begin() ) ); /*取并集运算*/
//set_union(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator<int>(cout," ")); /*取并集运算*/ //其中ostream_iterator的头文件是iterator
cout<<"A u B = {";
for(pos=A.begin(); pos!=A.end(); pos++)
{
if(pos!=A.begin())cout<<", ";
cout<<*pos;
}
cout<<"}"<<endl;
set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter( C2 , C2.begin() )); /*取交集运算*/
cout<<"A n B = {";
for(pos=C2.begin(); pos!=C2.end(); pos++)
{
if(pos!=C2.begin())cout<<", ";
cout<<*pos;
}
cout<<"}"<<endl;
set_difference( A.begin(), A.end(),B.begin(), B.end(),inserter( C3, C3.begin() ) ); /*取差集运算*/
cout<<"A - B = {";
for(pos=C3.begin(); pos!=C3.end(); pos++)
{
if(pos!=C3.begin())cout<<", ";
cout<<*pos;
}
cout<<"}"<<endl;
set_difference(C1.begin(),C1.end(), A.begin(), A.end(),inserter( C4, C4.begin() ) );/*取差集运算*/
cout<<"SA = {";
for(pos=C4.begin(); pos!=C4.end(); pos++)
{
if(pos!=C4.begin())cout<<", ";
cout<<*pos;
}
cout<<"}"<<endl;
set_difference(C1.begin(),C1.end(), B.begin(), B.end(),inserter( C5, C5.begin() ) );/*取差集运算*/
cout<<"SB = {";
for(pos=C5.begin(); pos!=C5.end(); pos++)
{
if(pos!=C5.begin())cout<<", ";
cout<<*pos;
}
cout<<"}"<<endl;
set_symmetric_difference(A.begin(),A.end(),B.begin(),B.end(),inserter( C6 , C6.begin() ) );///取 对称差集运算
cout<<"A ⊕ B = {";
for(pos=C6.begin(); pos!=C6.end(); pos++)
{
if(pos!=C6.begin())cout<<", ";
cout<<*pos;
}
cout<<"}"<<endl;
A.clear();
B.clear();//各个集合清零,否则下次使用会出错
C1.clear();
C2.clear();
C3.clear();
C4.clear();
C5.clear();
C6.clear();
}
}
(コードを変更することを忘れないでください)
unordered_set
ヘッダーファイル#include <unordered_set>
unordered_setとunordered_mapに実装されているパブリックインターフェイスはほぼ同じであるため、unordered_setとunordered_mapの内部実装はハッシュテーブルに基づいています。内部ハッシュテーブルは、チェーンアドレス方式を使用して格納されます。
unordered_setとsetの使用法に大きな違いはありませんが、効率はsetよりも高く、unordered_setは自動的に並べ替えられず、要素へのアクセス効率はo(1)に近いため、繰り返しません。 APIを設定します
//模板原型
template < class Key,
class Hash = hash<Key>,
class Pred = equal_to<Key>,
class Alloc = allocator<Key>
> class unordered_set;
-
C ++ 11でのunordered_setの説明は、おおまかに次のとおりです。unordered_setは、一意の(つまり、繰り返しがない)を格納する連想コンテナであり、コンテナ内の要素には特別な順序の関係がなく、コンテナは値ベースの高速要素検索を可能にします、フォワードイテレーションもサポートします。
-
unordered_set内では、要素は任意の順序で並べ替えられませんが、要素はグループ化され、要素値のハッシュ値によってスロット(Bucker、「バケット」として変換することもできます)に配置されるため、対応する各要素は次のようになります。要素値を介してすばやくアクセスできます(償却時間はO(1))の要素。
-
プロトタイプのキーは格納されるタイプを表し、ハッシュはハッシュ関数、equal_toは2つの要素が等しいかどうかを判断するために使用され、アロケーターはメモリ割り当て戦略です。通常の状況では、hashパラメーターとequal_toパラメーターのみを考慮します。
マルチセット
セットとマルチセットはどちらもコレクションクラスです。違いは、セットでは重複要素が許可されておらず、マルチセットでは重複要素が許可されていることです。
そしてAPIは基本的に同じです、ここに要約があります:
1. 常用函数
1) 构造函数和析构函数
set c:创建空集合,不包含任何元素
set c(op):以op为排序准则,产生一个空的set
set c1(c2):复制c2中的元素到c1中
set c(const value_type *first, const value_type* last):复制[first, last)之间元素构成新集合
set c(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新集合。
c.~set()销毁所有元素,释放内存
multiset mc:创建空集合,不包含任何元素
multiset mc(op):以op为排序准则,产生一个空的set
multiset c1(c2):复制c2中的元素到c1中
multiset c(const value_type *first, const value_type* last):复制[first, last)之间元素构成新集合
multiset c(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新集合。
c.~set()销毁所有元素,释放内存
2) 大小、判断空函数
int size() const:返回容器元素个数
bool empty() const:判断容器是否为空,若返回true,表明容器已空
3) 增加、删除函数
pair<iterator,bool> insert( x):插入元素x
iterator insert(iterator it,x):在迭代器it处插入元素x
void insert(const value_type *first,const value_type *last):插入[first, last)之间元素
iterator erase(iterator it):删除迭代器指针it处元素
iterator erase(iterator first,iterator last):删除[first, last)之间元素
size_type erase(const Key& key):删除元素值等于key的元素
4) 遍历函数
iterator begin():返回首元素的迭代器指针
iterator end():返回尾元素的迭代器指针
reverse_iterator rbegin():返回尾元素的逆向迭代器指针
reverse_iterator rend():返回首元素前一个位置的迭代器指针
5) 操作函数
const_iterator lower_bound(const Key& key):返回容器中大于等于key的迭代器指针
const_iterator upper_bound(const Key& key):返回容器中大于key的迭代器指针
int count(const Key& key) const:返回容器中元素等于key的元素的个数
pair<const_iterator,const_iterator> equal_range(const Key& key) const:返回容器中元素值等于key的迭代指针[first, last)
const_iterator find(const Key& key) const:查找功能,返回元素值等于key的迭代器指针
void swap(set& s):交换集合元素
void swap(multiset& s):交换多集合元素
unordered_multiset
unordered_multisetは、ハッシュテーブルをカプセル化する順序付けされていないコンテナであり、各要素は何度でも表示できます。重複する要素をここに格納できることを除いて、unordered_setと大差ありません。