1、简介
数学中的集合

2、操作
set特点值唯一
2.1 初始化
1、默认构造(可带参数)
2、复制构造
3、范围赋值构造
2.2 基本操作
(1)迭代器

与vector相似
(2)数据量操作

2.3 添加数据
(1)insert插入数据
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void Display(int val){
cout << val << endl;
}
int main(){
set<int> m;
for(int i=0;i<10;i++){
m.insert(i);
}
for_each(m.begin(),m.end(),Display);
}
通过返回值pair<iterator,bool>判断插入数据是否成功。
(2)insert指定位置插入数据
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void Display(int val){
cout << val << endl;
}
int main(){
set<int> m;
for(int i=0;i<10;i++){
m.insert(i);
}
m.insert(m.begin(),100);
for_each(m.begin(),m.end(),Display);
}
插入数据总是认为成功,如果已经存在,则返回已经存在的位置迭代器,否则,添加新的值,且返回位置迭代器。
2.4 遍历
(1)迭代器for循环
for(set<int>::iterator it = m.begin();it != m.end();it++){
cout << *it << endl;
}
(2)for_each()循环[推荐]
定义函数指针
inline void Display(int val){
cout << val << endl;
}
执行for_each
for_each(m.begin(),m.end(),Display);
(3)C++11auto迭代器写法
for(auto it = m.begin();it != m.end();it++){
cout << *it << endl;
}
(4)C++11 for-loop-scope迭代器写法[推荐]
for(auto p : m){
cout << p << endl;
}
(5)C++11 for_each()与lamdba表达式
for_each(m.begin(),m.end(),[](int p){
cout << p << endl;
});
2.5 查找
(1)count()判断值是否存在
if(m.count(val) == 1){
...
}
(2)find()判断值是否存在以及位置
set<int>::iterator it = m.find(val);
if(m.end() != it){
...
}
2.6 区域查找

2.7 删除
(1)关键字删除
m.erase(val);
(2)迭代器删除
m.erase(m.begin());
(3)区域删除
m.erase(it_a,it_b);
2.8 排序
默认按照val升序排列。自定义排序时,可以在实例化加上val的comp仿函数或者重载<运算符。
set<value类型,comp> m;
3、练习
3.1 set基本操作
#include <iostream>
#include<set>
using namespace std;
//打印模板
template<typename T>
void PrintContainer(const T& c){
for(int n:c){
cout << n << " ";
}
cout << endl;
}
int main(){
set<int> s = {1,4,7,8,3,2,2,1};
PrintContainer(s);
set<int>::iterator it = s.begin();
while(it != s.end()){
cout << *it++ << " ";
}
cout << endl;
s.insert(5);
PrintContainer(s);
s.insert(4);
PrintContainer(s);
s.insert(s.begin(),100);
PrintContainer(s);
s.erase(100);
PrintContainer(s);
s.erase(s.begin());
PrintContainer(s);
//查找,找到为1,没找到为0
cout << s.count(100) << endl;
cout << s.count(3) << endl;
//比较运算符的优先级很低
cout << (s.find(100)!=s.end()) << endl;
cout << (s.find(3)!=s.end()) << endl;
}
3.2 leecode448
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> res;
set<int> s(nums.begin(),nums.end());
for(int i=1;i<=nums.size();i++){
if(s.count(i) ==0){
res.push_back(i);
}
}
return res;
}
};
3.3 leecode217
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
set<int> s(nums.begin(),nums.end());
if(nums.size()!=s.size()){
return true;
}else{
return false;
}
}
};
3.4 leecode349
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> s1(nums1.begin(),nums1.end());
set<int> s2(nums2.begin(),nums2.end());
vector<int> res;
for(int n:s1){
if(s2.count(n) == 1){
res.push_back(n);
}
}
return res;
}
};
3.5 leecode287
class Solution {
public:
int findDuplicate(vector<int>& nums) {
set<int> s(nums.begin(),nums.end());
int res=0;
for(int n:nums){
if(s.count(n) ==1){
s.erase(n);
}else{
res = n;
break;
}
}
return res;
}
};
本文详细介绍了C++ STL中set容器的使用,包括初始化、添加数据、遍历、查找、删除及排序等操作。通过示例展示了不同方式的插入、查找、删除方法,并提供了LeetCode相关题目作为实践练习。

1797

被折叠的 条评论
为什么被折叠?



