c++ set用法詳解


c++ stack用法詳解

set

set就是集合,STL的set用二叉樹實現,集合中的每個元素只出現一次(參照數學中集合的互斥性),並且是排好序的(默認按鍵值升序排列)

訪問元素的時間復雜度是 O ( log ⁡ 2 n ) O(\log_2n) O(log2n)

在c++中,set的頭文件是#include<set>

set具有迭代器set<int>::iterator i 定義一個迭代器,名為i 可以把迭代器理解為C語言的指針

set常用操作

set<int> q;     //以int型為例 默認按鍵值升序
set<int,greater<int>> p;  //降序排列 
int x;
q.insert(x);	//將x插入q中
q.erase(x);		//刪除q中的x元素,返回0或1,0表示set中不存在x
q.clear();		//清空q
q.empty();		//判斷q是否為空,若是返回1,否則返回0
q.size();		//返回q中元素的個數
q.find(x);		//在q中查找x,返回x的迭代器,若x不存在,則返回指向q尾部的迭代器即 q.end()
q.lower_bound(x); //返回一個迭代器,指向第一個鍵值不小於x的元素
q.upper_bound(x); //返回一個迭代器,指向第一個鍵值大於x的元素

q.rend();		  //返回第一個元素的的前一個元素迭代器
q.begin();		  //返回指向q中第一個元素的迭代器

q.end();		 //返回指向q最后一個元素下一個位置的迭代器
q.rbegin();		 //返回最后一個元素

set單元素應用

#include<iostream>
#include<set>
using namespace std;
int main()
{
	set<int> q;   //默認按升序排列 
	q.insert(5);
	q.insert(5);
	q.insert(5);
	cout<<"q.size "<<q.size()<<endl;   //輸出 1 ,在set插入中相同元素只會存在一個
	
	q.clear(); //清空set
	cout<<"q.size "<<q.size()<<"\n\n";
	
	q.insert(4);
	q.insert(4);
	q.insert(3);
	q.insert(3); 
	q.insert(2);
	q.insert(1);
	
	cout<<"lower_bound "<<*q.lower_bound(3)<<endl;  //返回3 
	cout<<"upper_bound "<<*q.upper_bound(3)<<"\n\n";  //返回4 
	
	set<int>::iterator i;
	for( i=q.begin();i!=q.end();i++)   //set的遍歷 
		cout<<*i<<" ";				   //輸出1 2 3 4,可見自動按鍵值排序 
	cout<<endl;
	
	q.erase(4);  //刪除q中的 4 
	
	for(i=q.begin();i!=q.end();i++)  //再次遍歷set 只輸出 1 2 3 
		cout<<*i<<" ";
	cout<<"\n\n"; 
	
	
	set<int,greater<int>> p;  //降序排列 
	p.insert(1);
	p.insert(2);
	p.insert(3);
	p.insert(4);
	p.insert(5);
	for(i=p.begin();i!=p.end();i++)
		cout<<*i<<" ";
	cout<<endl;
	
	return 0;
}

1b3b81f8d1174077a22c078773afdc3a.png (459×238) (csdnimg.cn)

set多元素應用(結構體)

#include<iostream>
#include<set>
using namespace std;
struct node{
	int a,b;
	bool operator< (const node W)const
	{
		return a>W.a;  //按a的值升序 
	}
}t;
int main()
{
	set<node> q;
	t.a=1;
	t.b=2;
	q.insert(t);
	
	t.a=4;
	t.b=2;
	q.insert(t);
	
	t.a=3;
	t.b=5;
	q.insert(t);	
	
	set<node>::iterator i;
	for(i=q.begin();i!=q.end();i++)
	{
		t=*i;
		cout<<t.a<<" "<<t.b<<endl;
	}
	return 0; 
}

例題

題目:HDU - 2094 產生冠軍

代碼:

#include<iostream>
#include<set>
using namespace std;
int main()
{
	int n;
	string a,b;
	while(cin>>n && n)
	{
		set<string> A,B;
		for(int i=0;i<n;i++)
		{
			cin>>a>>b;
			A.insert(a);
			A.insert(b);
			B.insert(b);
		}
		
		if(A.size()-B.size()==1)
			cout<<"Yes\n";
		else
			cout<<"No\n";
	}
	return 0;
}

c++ stack用法詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM