STLいくつかのメモ

1.セット

セットに関して、説明しなければならないのはセット連想コンテナです。セットはコンテナとして、同じデータ型のデータ型を格納するためにも使用され、データセットからデータを取得できます。セット内の各要素の値は一意であり、システムはの値に従って自動的に並べ替えることができます。素子。

#include
set <type>変数名
//s.end()には値がなく、最後の要素の後の位置を指します
。セット内のクリアと消去の使用法がいくつ
かあります。
以前に保存したイテレータが各挿入後に無効にならないのはなぜですか。

 iterator这里就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本身已经失效了)。相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。即使时push_back的时候,容器内部空间可能不够,需要一块新的更大的内存,只有把以前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后,那么以前的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator。

ここに画像の説明を挿入

解決策:
二人が交代で自分の言葉を言うが、言えない言葉と言えない言葉は、言葉を言えない人が負ける。
交差点がない場合、n> mは最初に勝った人
交差点がある場合:同じ単語kを見つけ、
すべての単語をセットに入れて重複を削除します

明らかに、両方の人が最初に真ん中の段落を繰り返して最初に取る必要があります;
各人は一度に1つの単語しか取ることができません;
次に奇数は最初の人にとって有益です;
次に繰り返される真ん中の段落を削除します;
次の2つを仮定します人の単語数はx、yで
、前の繰り返し数が奇数の場合
x = x + 1;数が
偶数の場合、処理は不要です;
次にx、yを比較します;
(最初の人ほとんどの言葉で話すことができ、X = N-K +(K + 1)/ 2、二人目は、ほとんど言葉を言うことができ、Y = M-K + K / 2)
同じ単語は、最初の人が失われている
たびに最初になぜなら人は二人目の人を取り終える人はたくさんの言葉を持っています。

タイプ:ゲーム+欲?+ stl

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
    
    
	int n,m;
	string s;
	set<string> st;
	cin>>n>>m;
	int i,j;
	for(i=0;i<n+m;i++){
    
    
		cin>>s;
		
		st.insert(s);
	}
	int k=n+m-st.size();
	int x=n-k+(k+1)/2,y=m-k+k/2;
	
	if(x>y)
	printf("YES\n");
	else
	printf("NO\n");
	
}

2.マルチセット

マルチセットは一種の連想コンテナであり、ソートされたコレクションであり(要素はソートされています)、同じ要素が許可されます。

マルチセットコンテナ内の要素の値を直接変更することはできません。要素が変更された後、コンテナは自動的に順序を再調整しないため、コンテナの順序が破棄され、コンテナに対する検索やその他の操作で間違った結果が得られます。したがって、マルチセットコンテナ内の要素の値を変更する場合、正しいアプローチは、最初に要素を削除してから、新しい要素を挿入することです。

すべての標準的な連想コンテナと同様に、セットとマルチセットは通常、平衡二分木で完成します。

自動ソートの主な利点は、パフォーマンスの高い二分木検索要素を作成することであり、その検索関数アルゴリズムは対数的に複雑です。ただし、自動並べ替えにも制限があります。元の順序が乱れるため、要素の値を直接変更することはできません。要素の値を変更するには、最初に古い要素を削除してから、新しい要素を挿入する必要があります。したがって、セットとマルチセットには次の特性があります。

要素へのアクセスに直接使用される操作要素は提供されません
。イテレータを介した要素へのアクセス

ここに画像の説明を挿入
問題の解決策:
この問題は、実際には交差点を見つける問題です。

ソート後に配列を比較することで実装することも、STLで実装することもできます。ここでは前者の方法を採用しており、ソート比較のための単純な計算です。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<cstring>
#include<iostream>
#define N 10020
int a[N],b[N];
using namespace std;
int main(){
    
    
	int t,n,m;
	
	int i,j;
	cin>>t;
	

	while(t--){
    
    
		cin>>n>>m;
		for(i=0;i<n;i++){
    
    
			cin>>a[i];
			
		}
		for(i=0;i<m;i++){
    
    
			cin>>b[i];
		
		}
		sort(a,a+n);
		sort(b,b+m);
		i=0,j=0;
		int cnt=0;
		while(i<n&&j<m){
    
    
			if(a[i]==b[j]){
    
    
				i++,j++,cnt++;
			}else if(a[i]<b[j]){
    
    
				i++;
			}else{
    
    
				j++;
			}
		}
		printf("%d\n",n+m-2*cnt);
		
	}
	
}

または


#include <cstdio>
#include <set>
#include <cstdlib>
 
using namespace std;
 
int n, m;
multiset<int> s1, s2;
 
void input()
{
    
    
	s1.clear();
	s2.clear();
	
	int num;
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++) {
    
    
		scanf("%d", &num);
		s1.insert(num);
	}
	
	for (int i = 0; i < m; i++) {
    
    
		scanf("%d", &num);
		s2.insert(num);
	}
}
 
void solve()
{
    
    
	int ans = 0;
	int prev;
	for (multiset<int>::iterator it = s2.begin(); it != s2.end(); it++) {
    
    
		if (it == s2.begin()) prev = *it;
		else if (*it == prev) continue;
		
		if (s1.count(*it)) {
    
    
			ans += abs((int)(s1.count(*it) - s2.count(*it)));
			s1.erase(*it);
		} else {
    
    
			ans += s2.count(*it);
		}
		
		prev = *it;
	}
	
	ans += s1.size();
	
	printf("%d\n", ans);
}
 
int main()
{
    
    
	#ifndef ONLINE_JUDGE
		freopen("d:\\OJ\\uva_in.txt", "r", stdin);
	#endif
	
	int t;
	scanf("%d", &t);
	for (int i = 1; i <= t; i++) {
    
    
		input();
		solve();
	}
	return 0;
}

//获得两个set的并
 36     set<int> eg3;
 37     cout << "Union(两个set的并集):";
 38     set_union(eg1.begin(),
 39         eg1.end(),
 40         eg2.begin(),
 41         eg2.end(),
 42         insert_iterator<set<int> >(eg3, eg3.begin())
 43         );//注意第五个参数的形式
 44     copy(eg3.begin(), eg3.end(), ostream_iterator<int>(cout, " "));
 45     cout << endl;
 46 
 47     //获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下
 48     eg3.clear();
 49     set_intersection(eg1.begin(),
 50         eg1.end(),
 51         eg2.begin(),
 52         eg2.end(),
 53         insert_iterator<set<int> >(eg3, eg3.begin())
 54         );
 55     cout << "Intersection:";
 56     copy(eg3.begin(), eg3.end(), ostream_iterator<int>(cout, " "));
 57     cout << endl;
 58 
 59     //获得两个set的差
 60     eg3.clear();
 61     set_difference(eg1.begin(),
 62         eg1.end(), eg2.begin(),
 63         eg2.end(),
 64         insert_iterator<set<int> >(eg3, eg3.begin())
 65         );
 66     cout << "Difference:";
 67     copy(eg3.begin(), eg3.end(), ostream_iterator<int>(cout, " "));
 68     cout << endl;
 69 
 70     //获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B
 71     eg3.clear();
 72     set_symmetric_difference(eg1.begin(), eg1.end(), eg2.begin(), eg2.end(), insert_iterator<set<int> >(eg3, eg3.begin()));
 73     copy(eg3.begin(), eg3.end(), ostream_iterator<int>(cout, " "));
 74     cout << endl;
 75 

おすすめ

転載: blog.csdn.net/weixin_46064382/article/details/109558817