目录
1, 什么是set
C++中的一种容器数据类型, 也叫集合容器, 会对插入的数据进行自动排序
分为set和multiset, 前者不允许重复值, 后置允许
2, 创建set
通过set<数据类型> 对象名, 创建set, 数据类型可以是标准数据类型, 也可以是自定义类型
2-1, 标准数据类型
//指定容器中元素数据类型为string
set<string> s1;
2-2, 自定义数据类型
class Myclass
{
public:
Myclass() {};
Myclass(string name, int age) :m_name(name), m_age(age) {};
string m_name;
int m_age;
};
Myclass m("aaa", 1);
//容器中元素的类型为Myclass
set<Myclass> s1;
2-3, 其他创建方式
Myclass m1("aaa", 1);
set<Myclass> s1;
//拷贝构造方式创建
set<Myclass> s2(s1);
//通过迭代器指定区间方式创建
set<Myclass> s3(s2.begin(), s2.end());
3, 操作set
3-1, 赋值
通过set<数据类型> 对象名2 = 对象名1, 进行赋值
set<Myclass> s1;
set<Myclass> s2 = s1;
3-2, 添加元素(insert)
3-2-1, 添加元素(insert)
通过对象名.insert(值), 可向set中插入元素
3-2-2-1, 标准数据类型
set<string> s1;
//向set容器中插入字符串对象aaa
s1.insert("aaa");
3-2-2-2, 自定义数据类型
//仿函数,定义排序规则
class MyCompare
{
public:
bool operator()(const Myclass m1, Myclass m2) const
{
return m1.m_name > m2.m_name;
}
};
Myclass m1("aaa", 1);
//插入自定义类型时,需要指定仿函数
set<Myclass, MyCompare> s1;
//向set容器中插入m1
s1.insert(m1);
//通过迭代器指定位置插入
s1.insert(s1.begin(), m2);
3-3, 查询
通过for循环, 可遍历set中的元素
class Myclass
{
public:
Myclass() {};
Myclass(string name, int age) :m_name(name), m_age(age) {};
string m_name;
int m_age;
};
class MyCompare
{
public:
bool operator()(const Myclass m1, Myclass m2) const
{
return m1.m_name > m2.m_name;
}
};
int main()
{
Myclass m1("aaa", 1);
Myclass m2("bbb", 1);
set<Myclass, MyCompare> s1;
s1.insert(m1);
s1.insert(m2);
for (set<Myclass>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << "姓名:" << it->m_name << " 年龄:" << it->m_age << endl;
}
system("pause");
return 0;
}
3-4, 查找(find)
通过对象名.find(元素), 获取s1中的元素, 找到返回对应的迭代器,未找到返回s1.end()
3-4-1, 标准数据类型
set<string> s1;
s1.insert("aaa");
//通过s1.find(m1)查找s1中的m1元素, 找到返回对应的迭代器,未找到返回s1.end()
set<string>::iterator ret = s1.find("aaa1");
if (ret != s1.end())
{
cout << "存在" << endl;
}
else
{
cout << "不存在" << endl;
}
3-4-2, 自定义数据类型
//通过s1.find(m1)查找s1中的m1元素, 找到返回对应的迭代器,未找到返回s1.end()
set<Myclass, MyCompare>::iterator ret = s1.find(m1);
if (ret != s1.end())
{
cout << "存在m1" << endl;
}
else
{
cout << "不存在m1" << endl;
}
3-5, 获取长度(size)
通过对象名.size(), 获取set的元素个数
cout << s1.size() << endl;
3-6, 统计元素数量(count)
通过对象名.count(对象), 获取set的元素个数
cout << s1.count(m1) << endl;
3-7, 交换(swap)
通过对象名1.swap(对象名2), 交换两个set的元素, 两个set的数据类型需要一致
s1.swap(s2);
3-7, 删除元素(erase)
通过对象名.erase(迭代器位置), 删除元素
//指定迭代器位置删除元素
set<Myclass, MyCompare>::iterator it = s1.begin();
it++;
it++;
s1.erase(it);
3-8, 清空元素(clear)
通过对象名.clear(), 清空set元素
s1.clear();
//指定迭代器区间清空元素
s1.erase(s1.begin(), s1.end());
3-9, 判断是否为空(empty)
通过对象名.empty(), 判读set容器中元素是否为空, 为空返回1, 不为空返回0
cout << s1.empty() << endl;
4, multiset
multiset可插入重复的元素
int main()
{
multiset<string> s1;
s1.insert("m1");
s1.insert("m1");
s1.insert("m1");
for (multiset<string>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << endl;
}
system("pause");
return 0;
}