強大的set容器

weixin_43602607發表於2020-10-30

前言

建議先看STL裡的map,該文章中的set只是對STL的一種補充,事實上map的功能比set強大很多,基本上用set能實現的功能用map也能實現

基本函式

用法作用
s.begin(), s.end()返回集合的首尾迭代器
s.insert(k)向集合中加入元素k
s.earse(k)刪除集合中元素k
s.size()返回當前集合的元素個數
s.find(k)返回集合中指向元素k的迭代器。如果不存在這個元素,就返回s.end()
s.empty()返回當前集合是否為空,是返回1,否則返回0
s.clear()清空當前集合。
s.upper_bound()返回一個鍵值大於k的第一個元素的迭代器
s.lower_bound返回一個鍵值大於等於k的第一個元素的迭代器

用法與map大量相似,這裡只簡單介紹下二者的區別

查詢值

set不像map有鍵值和value,需要用it->first和it->second來返回對應的鍵值和value。set只有一個數值,取其數值只需要對迭代器進行取值符號即可

int main(){
	set<int>::iterator it;
	for(it=s.begin();i!=s.end();it++)cout<<*it<<" ";
	
	return 0;
}

二分查詢的函式

set支援lower_bound和upper_bound函式,可以查詢鍵值大於k的第一個元素的迭代器

int main(){
	set<int>::iterator it;
	it=s.lower_bound(k);
	cour<<*it;
	return 0;
}

事實上也可以用另一種方法實現,就是先將k插入,然後去查詢k所對應的迭代器的下一位,返回其值並將k刪除即可

set<int>s;
int main(){
	set<int>::iterator it;
	if(s.find(k)!=s.end()){
		it=s.find(k);
		it++;
		cout<<*it;
	}
	else {
		s.insert(k);
		it=s.find(k);
		it++;
		cout<<*it;
		s.erase(k);
	}
	return 0;
}

個人理解

map一般用來實現有關字串的對應值問題,而set更加關注數字集合的關係,使用set一般是為了解決兩個問題:去重和排序
不再展示其用法

思考一個問題

使用set會自動排序,如果我只想去重,不想排序怎麼辦??

相關文章