*****建議用baistl標準模板庫中的std::set——元素du不允zhi許重複dao,或者std::multiset——元素允許重複。這兩種集合效zhuan率非常高。
*****
*****用法舉bai例:
std::set<int> mySet;
int a,b,c,d;
a=1;
a=2;
a=3;
a=4;
mySet.insert(a);
mySet.insert(b);
mySet.insert(c);
mySet.insert(d); //erase()、find()、size()對應刪除、查找、求元素個數的函數
也許你會問,爲什麼不直接用數組?std::set相當數組最大的優勢是,集合中的元素都是按關鍵值排序的。std::set遇到關鍵值重複的,只保存一個值;而std::multiset允許重複元素並列存在。
===============
c++中的集合set是非常好用的,尤其是在求一些交集、並集、或者是輸出不重複的數。
需要注意的是,set是自動從小到大排序的,而且自動去除了重複的元素。
以下是幾個非常常見好用的方法:
1、insert()
將insert中的元素放入集合中,具體用法如下:
#include <iostream>
#include<set>
using namespace std;
int main() {
set<int> s;
s.insert(1);//將1放入集合s中
return 0;
}
2、find()
find(value)返回的是set值對應爲value的迭代器;
#include <iostream>
#include<set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(2);
auto it=s.find(2);
cout<<*it;//輸出結果爲2
return 0;
}
3、erase()
erase()有兩種用法:刪除某一元素、刪除一個區間內的所有元素
①刪除單個元素:
可以配合find函數一起使用
#include <iostream>
#include<set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(2);
s.erase(s.find(2));//刪除元素2
cout<<s.size();//此時集合中只有一個元素1
return 0;
}
②刪除一個區間的元素:
erase(first,last)刪除[first,last)的元素,這裏是左開右閉的
#include <iostream>
#include<set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
auto it=s.find(2);//it指向的是2在集合中的地址
s.erase(s.begin(),it);//刪除從開始到2的元素(注意,這裏不包括2)
for(it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
cout<<endl;
cout<<s.size();//此時容器的容積爲4;
return 0;
}
此時的輸出:
在這裏插入圖片描述
需要注意的是,除了vector和string支持s.begin()+3這樣的迭代器加上數字的形式,在別的裏面是不成立的,比如上述代碼如果寫成s.erase(s.begin(),2);是不成立的;
4、size()
用來獲得集合中元素的個數,代碼如下:
#include <iostream>
#include<set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
cout<<s.size();//此時輸出的是5
return 0;
}
5、clear()
用來清空集合中所有的元素,比如
#include <iostream>
#include<set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
cout<<s.size();
s.clear();
cout<<endl<<s.size();
return 0;
}
此時的輸出在這裏插入圖片描述
clear 函數等價於erase(s.begin(),s.end()),結果是一樣的
6、end()
只需要注意一點,end指的是集合中最後一個元素地址的下一個地址。
最後一個元素的地址是rbegin()
#include <iostream>
#include<set>
using namespace std;
int main() {
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
s.insert(100);
auto it=s.rbegin();
cout<<*it;//此時輸出100
return 0;
}
由與set自動排序,可能會導致某些時候出現運行超時的情況,可以換成unorder_set,這樣就不會自動排序了,時間會快很多!
如果你覺得對你有幫助,點個贊!