使用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 30printSet(s);beg = s.begin();s.erase(beg);// 30printSet(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;
}