特点:所有元素都会在插入时自动被排序。
set/multiset属于关联式容器,底层结构使用二叉树实现。
set和multiset容器区别:set不允许容器中有重复的元素, 而multiset允许。
std::set<int>s; //默认构造
s.insert(1);
s.insert(4);
s.insert(6);
s.insert(2);
s.insert(2);
//printSet(s); // 1 2 4 6
std::set<int>s1(s); //拷贝构造
printSet(s1); // 1 2 4 6
std::set<int>s2(s); //赋值构造
s2 = s1;
统计set容器大小以及交换set容器
std::set<int>s; //默认构造
s.insert(1);
s.insert(4);
s.insert(6);
s.insert(2);
s.insert(2);
if (!s.empty()) {
cout << s.size() << endl;
}
set<char>s1;
s1.insert('a');
s1.insert('c');
s1.insert('c');
s1.insert('b');
printSet(s1); // a b c
set<int>s2;
s2.insert(100);
s2.insert(400);
s2.insert(300);
s.swap(s2); // 仅限同类型集合交换
printSet(s); // 100 300 400
std::set<int>s; //默认构造
s.insert(1);
s.insert(4);
s.insert(6);
s.insert(2);
s.insert(2);
s.erase(7); //删除指定元素
s.erase(2);
s.erase(s.begin(),s.begin()++); //删除区间元素
s.clear();
printSet(s);
std::set<int>s; //默认构造
s.insert(1);
s.insert(4);
s.insert(6);
s.insert(2);
s.insert(2);
set<int>::iterator it = s.find(2);
if (it != s.end()) {
cout << "存在";
}
else if (it == s.end()) {
cout << "不存在";
}
printSet(s);
cout << s.count(3) << endl; // 0
cout << s.count(1); // 1
multiset<int>s1;
s1.insert(1);
s1.insert(2);
s1.insert(2);
s1.insert(6);
s1.insert(5);
printSet(s1); // 1 2 2 5 6
成对出现的数据,利用对组可以返回两个数据
pair<int,char>p(65, 'a');
pair<string,char>p1("tom", 'm');
cout << p1.first << " " << p1.second << " ";
pair<int, int>p3 = make_pair(1, 2);
cout << p3.first << p3.second << endl;
set容器默认排序规则为从小到大
set容器实现内置数据类型和自定义数据类型的排序
class Person {
public:
string name;
int age;
Person(string m_name,int m_age) {
name = m_name;
age = m_age;
}
};
class Mycompare {
public:
bool operator()(const Person & p1, const Person& p2) const{
return p1.age > p2.age;
}
bool operator()(int a, int b) const{
return a > b;
}
};
void test02() {
set<int, Mycompare>s2;
s2.insert(34);
s2.insert(32);
s2.insert(35);
s2.insert(346);
s2.insert(3);
for (set<int, Mycompare>::const_iterator it = s2.begin(); it != s2.end(); it++) {
cout << *it << "\n"; // 346 35 34 32 3
}
Person p1("曹操", 54);
Person p2("曹丕", 34);
Person p3("曹冲", 13);
Person p4("曹植", 24);
set<Person, Mycompare>s1;
s1.insert(p1);
s1.insert(p2);
s1.insert(p3);
s1.insert(p4);
for (set<Person, Mycompare>::const_iterator it = s1.begin(); it != s1.end(); it++) {
cout << it->name << " " << it->age << "\n";
}
}