STL学习(?、set容器)
目录
一、构造和赋值
二、大小和交换
三、插入和删除
四、查找和统计
五、set和multiset的区别
六、pair的使用
七、指定set内置类型排序规则
八、指定set里面自定义数据类型的排序规则
一、构造和赋值
set容器是关联式容器,元素插入自动排序。
函数原型
set<T> st // 默认构造
set(const set & st) // 拷贝构造
赋值
set& operator=(const set & st) // 重载等号
二、大小和交换
函数原型
size(); // 返回容器中元素的数目
empty(); // 判断容器是否为空
swap(); // 交换两个集合容器
#include<iostream>
#include<set>
using namespace std;void print_set(set<int> my_set)
{for(auto i:my_set){cout<<i<<endl;}
}
void test2()
{ set<int> s;s.insert(1);s.insert(3);s.insert(2);if(s.empty()){cout<<"s is empty"<<endl;}else{cout<<"s is not empty"<<endl;cout<<"s size is:"<<s.size()<<endl;}set<int> s2;s2.insert(10);s2.insert(20);s2.insert(30);print_set(s2);s2.swap(s);print_set(s2);
}int main()
{test2();return 0;
}
三、插入和删除
insert(elem) // 在容器中插入元素
clear() // 清空容器所有元素
erase(pos) // 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(begin,end) // 删除【beigin,end)迭代器之间的元素,返回下一个元素的迭代器
erase(elme) // 删除elme
四、查找和统计
函数原型
find(key) // 查找key是否存在,若存在,返回该元素的迭代器,不存在返回set.end()
五、set和multiset的区别
set不可以插入重复元素,multiset可以。
六、pair的使用
函数原型
pair<type,type> p(value1, value2)
pair<type,type>p = make_pair(value1, value2)
七、指定set内置类型排序规则
#include<iostream>
#include<set>
#include<string>
#include<algorithm>
using namespace std;void print_set(set<int> my_set)
{for(auto i:my_set){cout<<i<<" ";}cout<<endl;
}
class ComPare
{public:bool operator()(int a,int b){return a>b;}
};
void test2()
{ set<int> s;s.insert(1);s.insert(3);s.insert(2);print_set(s);set<int,ComPare> s2;s2.insert(1);s2.insert(3);s2.insert(2);for(auto i:s2){cout<<i<<" ";}cout<<endl;
}int main()
{test2();return 0;
}
八、指定set里面自定义数据类型的排序规则
值得一提的是,对于自定义消息类型的set,必须手动指明排序规则,不然编译器报错,因为编译器也不知道怎么排。
#include<iostream>
#include<set>
#include<string>
#include<algorithm>
using namespace std;void print_set(set<int> my_set)
{for(auto i:my_set){cout<<i<<" ";}cout<<endl;
}
class Person
{public:Person(string name,int age){this->name=name;this->age=age;}string name;int age;
};
class ComPare
{public:bool operator()(const Person &a, const Person &b){return a.age>b.age;}
};void test2()
{ set<Person,ComPare> s2;s2.insert(Person("张三",18));s2.insert(Person("李四",19));s2.insert(Person("王五",20));for(auto i:s2){cout<<i.name<<" "<<i.age<<endl;}
}int main()
{test2();return 0;
}