set基本概念
所有元素都会在插入时自动被排序,set/multiset属于关联式容器,底层结是用二叉树实现。 set不允许容器中有重复元素 multiset允许容器中有重复的元素 使用set需要包含头文件<set>
set构造和赋值
遍历打印set容器
void print(set<int>&s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int> s1;
s1.insert(6);
s1.insert(9);
s1.insert(8);
s1.insert(5);
s1.insert(6);
print(s1);
set<int>s2(s1);
print(s2);
set<int>s3 = s2;
print(s3);
}
5 6 8 9
5 6 8 9
5 6 8 9
set大小和交换
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
//set不支持resize()
void test02()
{
set<int> s1;
s1.insert(6);
s1.insert(4);
s1.insert(9);
s1.insert(2);
cout << "s1的大小" << s1.size() << endl;
if (s1.empty())
{
cout << "s1为空" << endl;
}
else
{
cout << "s1不为空" << endl;
}
set<int>s2;
s2.insert(1);
print(s2);
s2.swap(s1);
print(s2);
}
s1的大小4
s1不为空
1
2 4 6 9
set插入和删除
insert(elem); //在容器中插入元素
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(elem); //删除容器中值为elem的元素
void test03()
{
set<int>s1;
s1.insert(1);
s1.insert(5);
s1.insert(4);
s1.insert(8);
print(s1);
s1.erase(s1.begin());
print(s1);
s1.erase(5);
print(s1);
s1.erase(s1.begin(), s1.end());
}
运行结果:
1 4 5 8
4 5 8
4 8
set查找和统计
find(key); //查找key是否存在
//若存在,则返回该键元素的迭代器,若不存在,则返回set.end()
count(key); //统计key的个数 0 or 1,因为不存在相同的值
void test04()
{
set<int> s1;
s1.insert(2);
s1.insert(7);
s1.insert(0);
s1.insert(-8);
s1.insert(0);
set<int>::iterator pos = s1.find(0);
if (pos != s1.end())
{
cout << *pos << "is found" << endl;
}
else
{
cout << "can't find" << endl;
}
int num = s1.count(0);
cout << num << endl;
}
运行结果:
0is found
1
set和multiset区别
区别: 1.set不可以插入重复元素,而multiset可以 2.set插入数据的同时会返回插入结果,表示插入是否成功 3.multiset不会检测数据,因此可以重复插入
void test05()
{
set<int> s;
pair<set<int>::iterator, bool> ret = s.insert(1);
if (ret.second)
{
cout << "insert success" << endl;
}
else
{
cout << "insert fail" << endl;
}
ret = s.insert(1);
if (ret.second)
{
cout << "insert success" << endl;
}
else
{
cout << "insert fail" << endl;
}
multiset<int> ms;
ms.insert(1);
ms.insert(1);
ms.insert(0);
for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
运行结果:
insert success
insert fail
0 1 1
pair队组创建
成对出现的数码,利用对组可以返回两个数据
void test06()
{
pair<string, int> p("Xiaorui", 19);
cout << "姓名 " << p.first << " 年龄 " << p.second << endl;
pair<string, int> p1 = make_pair("Xiaowu", 20);
cout << "姓名 " << p1.first << " 年龄 " << p1.second << endl;
}
运行结果:
姓名 Xiaorui 年龄 19
姓名 Xiaowu 年龄 20
set容器排序
set容器默认排序规则为从小到大,利用仿函数可以改变排序规则
set内部存放内置数据类型
class Mycompare
{
public:
bool operator()(int v1,int v2)
{
return v1 > v2;
}
};
void test07()
{
set<int> s1;
s1.insert(6);
s1.insert(0);
s1.insert(7);
s1.insert(6);
s1.insert(5);
print(s1);
set<int,Mycompare> s2;
s2.insert(6);
s2.insert(0);
s2.insert(7);
s2.insert(6);
s2.insert(5);
for (set<int, Mycompare>::iterator it = s2.begin(); it != s2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
运行结果:
0 5 6 7
7 6 5 0
set内部存放自定义数据类型
class Person
{
public:
Person(string name, int age)
{
_name = name;
_age = age;
}
string _name;
int _age;
};
class Personcompare
{
public:
bool operator()(const Person &p1,const Person &p2)
{
return p1._age < p2._age;
}
};
void test08()
{
set<Person,Personcompare> s;
Person p1("Tom", 9);
Person p2("Jerry", 4);
Person p3("Jack", 6);
Person p4 = p3;
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for (set<Person, Personcompare>::iterator it = s.begin(); it != s.end(); it++)
{
cout << "name " << it->_name << " age " << it->_age << endl;
}
}
运行结果:
name Jerry age 4
name Jack age 6
name Tom age 9
unordered_set-无序的set
void test09()
{
unordered_set<int> us;
us.insert(8);
us.insert(0);
us.insert(6);
us.insert(4);
us.insert(0);
for (unordered_set<int>::iterator it = us.begin(); it != us.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
运行结果:
0 8 6 4
|