简介: 所有元素都会在插入时会被自动排序,例如,在set容器放入元素1、5、9、3、4、7时,打印输出变成1、3、4、5、7、9.
本质: set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
#include
即可功能描述: 创建set容器以及赋值
构造:
set st;
//默认构造函数:set(const set &st);
//拷贝构造函数赋值:
set& operator=(const set &st);
//重载等号操作符代码示例:
void printSet(const set<int>& s)
{
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void printmMultiset(const multiset<int>& s)
{
for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test()
{
int n = 50;
set<int> s1;
//set只有insert()方式插入数据
s1.insert(18);
s1.insert(23);
s1.insert(25);
s1.insert(23);
s1.insert(21);
s1.insert(23);
s1.insert(20);
cout << "默认构造 set\t s1:";
//set容器特点:所有元素插入时会被排序,且不允许有重复元素
printSet(s1);
cout << string(n, '-') << endl;
set<int> s2(s1);
cout << "拷贝构造 set\t s2:";
printSet(s2);
cout << string(n, '-') << endl;
set<int> s3;
s3 = s2;
cout << "复制操作 set\t s3:";
printSet(s3);
cout << string(n, '-') << endl;
multiset<int> s4;
//multiset只有insert()方式插入数据
s4.insert(18);
s4.insert(23);
s4.insert(25);
s4.insert(23);
s4.insert(21);
s4.insert(23);
s4.insert(20);
cout << "默认构造 multiset s4:";
//multiset容器特点:所有元素插入时会被排序,且允许有重复元素
printmMultiset(s4);
cout << string(n, '-') << endl;
}
功能描述: 统计set容器大小以及交换set容器
函数原型:
size();
//返回容器中元素的数目empty();
//判断容器是否为空swap(st);
//交换两个集合容器注意: 在set中没有resize(),不允许重新指定大小。在之前学习的容器中,resize()默认机制是0填充,而set不允许有重复值,所有不能有resize()。
代码示例:
void printSet(const set<int>& s)
{
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void printmMultiset(const multiset<int>& s)
{
for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void setisEmpty(const set<int>& s)
{
if (s.empty())
{
cout << "set容器为空!" << endl;
}
else
{
cout << "set容器不为空,且容器大小为:" << s.size() << endl;
}
}
//大小
void test1()
{
cout << "大小操作\n" << endl;
int n = 50;
set<int> s1;
cout << "插值前 set\ts1:";
printSet(s1);
setisEmpty(s1);
cout << string(n, '-') << endl;
//set只有insert()方式插入数据
s1.insert(18);
s1.insert(23);
s1.insert(25);
s1.insert(23);
s1.insert(21);
s1.insert(23);
s1.insert(20);
cout << "插值后 set\ts1:";
printSet(s1);
setisEmpty(s1);
cout << string(n, '-') << endl;
}
//交换
void test2()
{
cout << "\n交换操作\n\n交换前" << endl;
int n = 50;
multiset<int> s1;
s1.insert(18);
s1.insert(23);
s1.insert(25);
s1.insert(23);
s1.insert(21);
s1.insert(23);
s1.insert(20);
cout << "multiset\ts1:";
printmMultiset(s1);
cout << string(n, ' ') << endl;
multiset<int> s2;
s2.insert(14);
s2.insert(10);
s2.insert(15);
s2.insert(11);
s2.insert(12);
s2.insert(13);
cout << "multiset\ts2:";
printmMultiset(s2);
cout << string(n, '-') << endl;
cout << "交换后\ns1:";
printmMultiset(s1);
cout << string(n, ' ') << endl;
cout << "s2:";
printmMultiset(s2);
cout << string(n, '-') << endl;
}
总结:
功能描述: set容器进行插入数据和删除数据
函数原型:
insert(elem);
//在容器中插入元素。clear();
//清除所有元素erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(elem);
//删除容器中值为elem的元素。注意: 没有头插头删和尾插尾删的操作,插入只有insert。set的删除可以传入迭代器、区间,还可以指定值删除,类似于list的remove。
代码示例:
void printSet(const set<int>& s)
{
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//插入
void test1()
{
int n = 50;
set<int> s1;
//set只有insert()方式插入数据
s1.insert(18);
s1.insert(23);
s1.insert(25);
s1.insert(23);
s1.insert(21);
s1.insert(23);
s1.insert(20);
cout << "删除前\t\ts1:";
printSet(s1);
cout << string(n, '-') << endl;
//删除
s1.erase(s1.begin());//删除第一个元素
cout << "删除第一个元素\ts1:";
printSet(s1);
cout << string(n, '-') << endl;
s1.erase(21);//删除指定元素
cout << "删除指定元素\ts1:";
printSet(s1);
cout << string(n, '-') << endl;
//清空
//s1.erase(s1.begin(), s1.end());//erase清空
s1.clear();
cout << "清空\t\ts1:";
printSet(s1);
cout << string(n, '-') << endl;
}
功能描述: 对set容器进行查找数据以及统计数据
函数原型:
find(key);
//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(),结束的位置count(key);
//统计key的元素个数。对set而言,返回值是0或1,set不允许有重复值;对multiset而言,返回值有可能大于1,multiset允许有重复值。代码示例:
void printSet(const set<int>& s)
{
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void printMultiset(const multiset<int>& s)
{
for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test1()
{
int n = 50;
set<int> s1;
s1.insert(18);
s1.insert(23);
s1.insert(25);
s1.insert(23);
s1.insert(21);
s1.insert(23);
s1.insert(20);
multiset<int> s2;
s2.insert(18);
s2.insert(23);
s2.insert(25);
s2.insert(23);
s2.insert(21);
s2.insert(23);
s2.insert(20);
cout << "s1:";
printSet(s1);
cout << string(n, ' ') << endl;
cout << "s2:";
printMultiset(s2);
cout << string(n, '-') << endl;
//查找
cout << "\n查找" << endl;
set<int>::iterator pos1 = s1.find(21);
cout << "查找21元素\ns1:";
if (pos1!=s1.end())
{
cout << "查找成功,值为:" << * pos1 << endl;
}
else
{
cout << "查找失败,值不存为或为空容器!" << endl;
}
cout << string(n, ' ') << endl;
set<int>::iterator pos2 = s2.find(21);
cout << "查找21元素\ns2:";
if (pos2 != s2.end())
{
cout << "查找成功,值为:" << *pos2 << endl;
}
else
{
cout << "查找失败,值不存为或为空容器!" << endl;
}
cout << string(n, '-') << endl;
//统计
cout << "\n统计" << endl;
int num1 = s1.count(23);
cout << "set s1中23的个数为:" << num1 << endl;
cout << string(n, '-') << endl;
int num2 = s2.count(23);
cout << "multiset s2中23的个数为:" << num2 << endl;
cout << string(n, '-') << endl;
}
总结: