使用set容器时需要导入头文件:#include <set>
set和multiset区别:
set不允许容器中有重复的元素
multiset允许容器中有重复的元素
1. 构造函数
set<T> st;
set s(const &st);
void printSet(set<int>& s)
{
for (set<int>::const_iterator it = s.begin();it!=s.end();it++)
{
cout << *it << ends;
}
cout << endl;
}
int main() {
set<int> s;
// 默认构造函数
s.insert(20);
s.insert(10);
s.insert(30);
s.insert(-10);
printSet(s);
set<int> s1(s);
printSet(s1);
// 拷贝构造
set<int> s2 = s1;
// 赋值
printSet(s2);
return 0;
}
特点:1. 所有元素插入时自动被排序;2. set容器不允许插入重复值
2. set容器–大小和交换
size(); // 返回容器中元素的数组
empty(); // 判断容器是否为空
swap(); // 交换两个集合容器
int main() {
set<int> s;
// 默认构造函数
s.insert(20);
s.insert(10);
s.insert(30);
s.insert(-10);
printSet(s);
cout << "s的大小为:" << s.size() << endl;
if(!s.empty())
{
cout << "s不为null" << endl;
}
else
{
cout << "s为null" << endl;
}
set<int> s2;
s2.insert(100);
s2.insert(-90);
printSet(s2);
s.swap(s2);
printSet(s);
printSet(s2);
return 0;
}
3. 插入和删除
insert(elem);
clear();
erase(pos); // 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end); // 删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(elem); // 删除容器中值为elem的元素
int main() {
set<int> s;
// 默认构造函数
s.insert(20);
s.insert(10);
s.insert(30);
s.insert(-10);
s.insert(-120);
printSet(s);
set<int>::iterator beg = s.begin(),end=s.end();
beg ++;
end --;
s.erase(beg,end);
// -120 -10 10 20 30
printSet(s);
beg = s.begin();
s.erase(beg);
// 30
printSet(s);
return 0;
}
4. 查找和统计
find(key); // 查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); // 统计key的元素个数
int main() {
set<int> s;
// 默认构造函数
s.insert(20);
s.insert(10);
s.insert(30);
s.insert(-10);
s.insert(-120);
printSet(s);
auto it = s.find(-120);
if(it !=s.end())
{
cout << "容器s中存在元素-120"<< endl;
}
else
{
cout << "容器s中不存在元素-120"<< endl;
}
int a = s.count(-120);
cout << "set容器-120的个数为:" << a << endl;
return 0;
}
5. set容器的排序
set容器默认排序规则为从小到大
class MyCompare{
public:
bool operator()(int v1,int v2)
{
return v1 > v2;
}
};
// 降序
int main() {
set<int> s;
// 默认构造函数
s.insert(20);
s.insert(10);
s.insert(30);
s.insert(-10);
s.insert(-120);
printSet(s);
// 升序
set<int,MyCompare> s1;
s1.insert(20);
s1.insert(10);
s1.insert(30);
s1.insert(-10);
s1.insert(-120);
for (set<int,MyCompare>::iterator it = s1.begin();it!=s1.end();it++)
{
cout << *it << ends;
}
// 降序
cout << endl;
return 0;
}