基本概念
构造和赋值
功能描述:创建set容器以及赋值
#include <algorithm> //算法
#include <iostream>
#include <set>
#include <string>
using namespace std;
// set/multiset容器
void printSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int> s1;
//插入数据只有insert
s1.insert(10);
s1.insert(5);
s1.insert(2);
s1.insert(20);
// s1.insert(5); //不允许插入重复的值
//插入的时候会自动排序
printSet(s1);
set<int>s2(s1);
printSet(s2);
//赋值
set<int>s3 = s2;
}
int main()
{
test01();
}
set大小和交换
#include <algorithm> //算法
#include <iostream>
#include <set>
#include <string>
using namespace std;
// set/multiset容器
void printSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int> s1;
//插入数据只有insert
s1.insert(10);
s1.insert(5);
s1.insert(2);
s1.insert(20);
printSet(s1);
//判断为空
if (!s1.empty()) {
cout << s1.size()<<endl;
} else {
cout << "为空" << endl;
}
}
int main()
{
test01();
}
set插入和删除
功能描述:
set容器的插入和删除数据
#include <algorithm> //算法
#include <iostream>
#include <set>
#include <string>
using namespace std;
// set/multiset容器
void printSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int> s1;
//插入数据只有insert
s1.insert(10);
s1.insert(5);
s1.insert(2);
s1.insert(20);
printSet(s1); // 2 5 10 20
//删除
s1.erase(20); //删除2数据
// s1.erase(s1.begin());
set<int>::iterator it = s1.erase(s1.begin()); //一起删,数据会错误 ,删除后返回迭代器
cout << "返回的迭代器" << *it << endl; // 10 返回原先迭代器下一个元素的迭代器
printSet(s1);
s1.clear(); //清空
printSet(s1);
}
int main()
{
test01();
}
查找和统计
功能描述:
对set容器进行查找数据和统计数据
#include <algorithm> //算法
#include <iostream>
#include <set>
#include <string>
using namespace std;
// set/multiset容器
void printSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int> s1;
//插入数据只有insert
s1.insert(10);
s1.insert(5);
s1.insert(3);
s1.insert(20);
s1.insert(50);
printSet(s1); // 2 5 10 20
cout << "set容器的个数" << s1.size() << endl;
//查找,统计
set<int>::iterator pos = s1.find(1); //找到返回元素,找不到返回元素个数
cout << *pos << endl;
if (pos != s1.end()) {
cout << "找到元素" << endl;
} else {
cout << "未找到元素" << endl;
}
set<int>::iterator be = s1.begin();
cout << "迭代器开头" << *be << endl; // 3 开头元素
be = s1.end();
cout << "迭代器结尾" << *be << endl; // 4 end(),指向的是最后一个元素的后一个下标,结尾解引用为元素大小
//统计个数
int num = s1.count(3);
cout << "容器中3出现的个数" << num << endl;
}
int main()
{
test01();
}
set和multiset区别
学习目标:
掌握set和multiset区别。
#include <algorithm> //算法
#include <iostream>
#include <set>
#include <string>
using namespace std;
// set/multiset容器
void printSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void printMultiset(multiset<int>& s)
{
for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int> s1;
//插入数据只有insert
s1.insert(10);
s1.insert(5);
s1.insert(3);
s1.insert(20);
pair<set<int>::iterator, bool> ret = s1.insert(3); //返回一个pair模板
printSet(s1); // 2 5 10 20
if (ret.second) { //如果第二个为真,
cout << *ret.first << endl; //获取第一个数据
} else {
cout << "插入失败" << endl;
}
}
void test02()
{
multiset<int> ms;
//允许插入重复的值
ms.insert(10);
ms.insert(1);
ms.insert(10);
printMultiset(ms);
}
int main()
{
test02();
}
pair使用
#include <algorithm> //算法
#include <iostream>
#include <string>
using namespace std;
// pair队组
void printPair(pair<int, int>& p)
{
cout << p.first << endl;
cout << p.second << endl;
}
void test02()
{
pair<int, int> p(1, 10);
printPair(p);
//第二种方式
pair<string, int> p2 = make_pair(string("test"), 1);
printPair(p2);
}
int main()
{
test02();
}
set容器排序
示例一:set存放内置的数据类型
#include <algorithm> //算法
#include <iostream>
#include <set>
#include <string>
using namespace std;
void printSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
class MyCompare {
public:
bool operator()(int v1, int v2) const //需要加const进行修饰,不可以改变
{
return v1 > v2; //大于返回真
}
};
void test02()
{
set<int> s;
s.insert(1);
s.insert(5);
s.insert(0);
s.insert(30);
printSet(s);
//指定规则为从小到大
// 插入数据前告诉他
set<int, MyCompare> s1; //仿函数
s1.insert(1);
s1.insert(5);
s1.insert(0);
s1.insert(30);
for (set<int, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main()
{
test02();
}
总结:利用仿函数可以指定set容器的排序规则。
示例二:set存放自定义的数据类型
#include <algorithm> //算法
#include <iostream>
#include <set>
#include <string>
using namespace std;
class Person {
public:
string m_Name;
int m_Age;
Person(string name, int age)
{
this->m_Age = age;
this->m_Name = name;
}
};
class MyCompare {
public:
//比较对象必须作为常量可调用。
bool operator()(const Person& p1, const Person& p2) const //因为要对比数据,数据内部需要加const进行限定
{
return p1.m_Age > p2.m_Age;
}
};
void test02()
{
set<Person, MyCompare> s;
Person p1("张三", 13);
Person p2("李四", 10);
Person p3("王五", 10); //因为是set不允许重复操作
Person p4("赵六", 1);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for (set<Person, MyCompare>::iterator it = s.begin(); it != s.end(); it++) {
cout << it->m_Name << " " << it->m_Age;
}
cout << endl;
}
int main()
{
test02();
}