C++setの使い方を詳しく説明します。
C++setの使い方を詳しく説明します。
セットもSTLでよく見られる容器です。セットコンテナは、赤と黒の木のバランスを実現した二叉検索ツリーのデータ構造を実現し、二叉の木の配列を自動的に調整し、元素を適切な位置に配置します。set容器に含まれる要素の値は唯一であり、集合中の要素は一定の順序で並べられている。
セットを作る目的は速く検索するためで、キーの値を直接修正してはいけません。
setのいくつかのよくある操作: begin()は、第1の要素を指すローズマリー を返す。 clear()は、すべての要素 をクリアする。 count()は、ある値要素の個数 を返します。 empty()セットが空だったら、trueに戻ります。 end()は、最後の要素を指した後のローズマリーを返します。最後の要素 ではありません。 erase()は、セット内の要素 を削除する。 find()は、検索された要素を指すローズマリー を返す。 insert()は、セットに要素 を挿入する。 max_size()は、セットが収容できる要素の最大制限値 を返します。 size()セットにおける要素の数 swap()は2つのセット変数を交換します。
実はsetのほとんどの操作はvectorと似ていますが、setはランダムアクセスをサポートしていません。セットは一つの要素を入れると、この元素の位置を調整して、適当な位置に置くので、セットの中に一つのinsert挿入操作しかありません。
集合にとって、私達は普通に集合、交差、差集、補足などの操作があります。だからsetの操作にも似たような集合操作があります。
Description
機能:容器の指定位置に要素を挿入する
制限:inset()のメンバー関数を提供した容器の中でのみ、inserterが機能します。すべてのSTL容器はinset()関数を提供します。
適用:すべてのSTL容器
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。
セットもSTLでよく見られる容器です。セットコンテナは、赤と黒の木のバランスを実現した二叉検索ツリーのデータ構造を実現し、二叉の木の配列を自動的に調整し、元素を適切な位置に配置します。set容器に含まれる要素の値は唯一であり、集合中の要素は一定の順序で並べられている。
セットを作る目的は速く検索するためで、キーの値を直接修正してはいけません。
setのいくつかのよくある操作:
実はsetのほとんどの操作はvectorと似ていますが、setはランダムアクセスをサポートしていません。セットは一つの要素を入れると、この元素の位置を調整して、適当な位置に置くので、セットの中に一つのinsert挿入操作しかありません。
集合にとって、私達は普通に集合、交差、差集、補足などの操作があります。だからsetの操作にも似たような集合操作があります。
std::set_intersection() : 。
std::set_union() :
std::set_difference():
std::set_symmetric_difference():
学校OJでこのいくつかの操作ができる問題があります。次は学校OJの問題です。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}
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 C B)、 。
“{}” , “, ” 。
Sample Input
14 1 2 3 10
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<vector>
using namespace std;
void print(set<int> a)
{
if(a.begin() == a.end())
cout << "}" << endl;
for(set<int>::iterator it = a.begin();it!=a.end();it++)
{
if(++it==a.end())
{
it--;
cout << *it << "}
";
}
else
{
it--;
cout << *it << ", ";
}
}
}
int main()
{
int T, cou = 0;
set<int> a, b, c;
cin >> T;
while(T--)
{
cou++;
a.clear(), b.clear(), c.clear();
int n;
cin >> n;
for(int i=0;i<n;i++)
{
int x;
cin >> x;
a.insert(x);
}
cin >> n;
for(int i=0;i<n;i++)
{
int x;
cin >> x;
b.insert(x);
}
cout << "Case# " << cou << ":" << endl;
cout << "A = {";
print(a);
cout << "B = {";
print(b);
set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
cout << "A u B = {";
print(c);
c.clear();
set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
cout << "A n B = {";
print(c);
c.clear();
set_difference(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
cout << "A - B = {";
print(c);
c.clear();
set_difference(b.begin(),b.end(),a.begin(),a.end(),inserter(c,c.begin()));
cout << "SA = {";
print(c);
c.clear();
set_difference(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
cout << "SB = {";
print(c);
}
return 0;
}
inserterは、ローズマリーアダプターに挿入されたローズマリーです。原理:その内部呼び出しinsert()機能:容器の指定位置に要素を挿入する
制限:inset()のメンバー関数を提供した容器の中でのみ、inserterが機能します。すべてのSTL容器はinset()関数を提供します。
適用:すべてのSTL容器
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。