01 set容器_构造与赋值

02 set容器_大小和交换

03 set容器_插入和删除

04 set容器_查找和统计

05 set容器_set和multiset区别

06 pair对组_对组的创建

07 set容器_排序

08 set容器_排序(自定义类型)


01 set容器_构造与赋值

#include<iostream>
using namespace std;
#include<set>

void printSet(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	set<int> s;
	s.insert(10); //插入只有insert
	s.insert(30);
	s.insert(12);
	s.insert(98);
	s.insert(30);

	//遍历容器
	//set容器特点:所有元素插入时候自动被排序
	//lset容器不允许插入重复值

	//拷贝构造
	printSet(s);
	set<int> s2(s);
	printSet(s2);
	//赋值
	set<int> s3;
	s3 = s2;
	printSet(s3);

}

int main()
{
	test01();
	system("pause");
	return 0;
}

//总结:
//set容器插入数据时用insert
//set容器插入数据的数据会自动排序

02 set容器_大小和交换

#include<iostream>
using namespace std;
#include<set>

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;
	s1.insert(10); //插入只有insert
	s1.insert(30);
	s1.insert(12);
	s1.insert(98);
	s1.insert(30);
	printSet(s1);

	//判断是否为空
	if (s1.empty())
	{
		cout << "s1为空" << endl;
	}
	else
	{
		cout << "s1不为空" << endl;

		cout << "s1大小为" <<s1.size()<< endl; //重复的没算入大小	
	}
}

void test02()
{
	set<int> s1;
	s1.insert(10); 
	s1.insert(30);
	s1.insert(12);
	s1.insert(98);
	s1.insert(30);
	set<int> s2;
	s2.insert(100); //插入只有insert
	s2.insert(300);
	s2.insert(120);
	s2.insert(980);
	s2.insert(300);
	cout << "交换前" << endl;
	printSet(s1); 
	printSet(s2);

	s1.swap(s2);
	cout << "交换后" << endl;
	printSet(s1);
	printSet(s2);

}
int main()
{

	//test01();
	test02();
	system("pause");
	return 0;
}

//总结:
//统计大小--size
//判断是否为空--empty
//交换容器-Slvap


03 set容器_插入和删除

#include<iostream>
using namespace std;
#include<set>

void printSet(set<int> &s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{

	set<int> s;
	s.insert(23);
	s.insert(11);
	s.insert(34);
	s.insert(46);
	printSet(s);

	//删除
	s.erase(s.begin());
	printSet(s);
	//删除重载版本
	s.erase(34);
	printSet(s);

	//清空
	//s.erase(s.begin(), s.end());
	s.clear();
	printSet(s);

}

int main()
{
	test01();
	system("pause");
	return 0;

}

04 set容器_查找和统计

#include<iostream>
using namespace std;
#include<set>


void test01()
{

	set<int> s;
	s.insert(23);
	s.insert(11);
	s.insert(34);
	s.insert(46);
	
	//查找
	set<int>::iterator pos = s.find(34);

	if (pos != s.end())
	{
		cout << "找到"<<endl;
	}
	else
	{
		cout << "没找到了" << endl;
	}

	


}

void test02()
{

	set<int> s;
	s.insert(23);
	s.insert(11);
	s.insert(34);
	s.insert(46);
	s.insert(34);
	//统计34个数
	int num = s.count(34);
	//对应set容器统计而言要么是0,要么是1
	cout << "num=" << num<< endl;

}
int main()
{
	//test01();
	test02();

	system("pause");
	return 0;

}

05 set容器_set和multiset区别

#include<iostream>
using namespace std;
#include<set>


void test01()
{
	set<int> s;
	pair<set<int>::iterator, bool> ret = s.insert(10);
	if (ret.second)
	{
		cout << "第一次插入成功" << endl;
	}
	else
	{
		cout << "第一次插入失败" << endl;
	}

	pair<set<int>::iterator, bool> ret2 = s.insert(10);
	if (ret2.second)
	{
		cout << "第二次插入成功" << endl;
	}
	else
	{
		cout << "第二次插入失败" << endl;
	}

	//multiset可以插重复值
	multiset<int>m;
	m.insert(10);
	m.insert(10);
	m.insert(10);
	m.insert(10);
	for (multiset<int>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << (*it) << " ";
	}
	cout << endl;

}

int main()
{
	test01();
	system("pause");
	return 0;
}

//总结:
//如果不允许插入重复数据可以利用set
//如果需要插入重复数据利用multiset

06 pair对组_对组的创建

#include<iostream>
using namespace std;

void test01()
{
	pair<string, int> p("tom", 20);
	cout << "姓名:" << p.first << " ,年龄" << p.second << endl;

	pair<string, int> p2 = make_pair("jack", 34);
	cout << "姓名:" << p2.first << " ,年龄" << p2.second << endl;

}

int main()
{

	test01();
	system("pause");
	return 0;
}

//总结:
//两种方式都可以创建对组,记住一种即可

 07 set容器_排序

#include<iostream>
using namespace std;
#include<set>


class MyCompare {
public:
	bool operator()(int v1, int v2) const
	{
		return v1 > v2;
	}

};

void test01()
{
	set<int> s1;
	s1.insert(10);
	s1.insert(50);
	s1.insert(45);
	s1.insert(24);
	s1.insert(47);
	for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	set<int, MyCompare> s2;
	s2.insert(120);
	s2.insert(53);
	s2.insert(45);
	s2.insert(54);
	s2.insert(49);
	for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}

int main()
{
	test01();
	system("pause");
	return 0;
}

出现报错

C++错误C3848:具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)

解决方案:
在仿函数中加入const

个人理解应该是Visual Studio的编译器对此做出了更新,要求必须使用const限定

08 set容器_排序(自定义类型)

同07一样出现报错,加入const就好了

#include<iostream>
using namespace std;
#include<set>

class Person {
public:
	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	string m_name;
	int m_age;
};

class Compare {
public:
	bool operator()(const Person& p1, const Person& p2) const
	{
		return p1.m_age > p2.m_age;
	}
};

void test01()
{
	set<Person, Compare> s;
	Person p1("张飞", 24);
	Person p2("刘备", 34);
	Person p3("关羽", 28);
	Person p4("赵云", 56);
	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);

	for (set<Person, Compare> ::iterator it = s.begin(); it!=s.end(); it++)

	{
		cout << "姓名:" << it->m_name << " 年龄" << it->m_age << endl;
	}

}

int main()
{
	test01();
	system("pause");
	return 0;
}

//总结
//对于自定义的数据类型,set必须指定排序规则才可以插入数据