C++ multiset集合操练

C++ multiset集合操练

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <set>
using namespace std;
/*
multiset是一个集合容器,其中所包含的元素可以不唯一,集合中的元素按一定顺序排列
元素插入过程是按排序规则插入,故不可指定位置插入
multiset采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入删除操作上比vector快
multiset不能直接存取元素(即,不可使用[]和*.at())
multiset与set的区别:set支持唯一键值,每个元素只出现一次;multiset同一值可出现多次
不可直接修改set和multiset中的元素值,因为该容器是自动排序的。要想修改一个元素,必须先删除它,再插入新的元素
*/
class Student
{
public:
	Student(string name, int age)
	{
		this->name = name;
		this->age = age;
	}
public:
	string	name;
	int		age;
};

struct FuncStudent
{
	bool operator()(const Student& left, const Student& right)
	{
		return (left.age < right.age);
	}
};

int main()
{
	//1 基本数据类型
	multiset<int> set1;//相当于 set<int, less<int>> set1//默认从小到大
	for (int i = 0; i < 5; i++)
	{
		int tmp = rand();
		set1.insert(tmp);
	}
	set1.insert(5);
	set1.insert(100);
	set1.insert(100);

	for (multiset<int>::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	//5 100 6334 11478 15724 18467 19169

	//删除集合
	while (!set1.empty())
	{
		multiset<int>::iterator it = set1.begin();
		cout << *it << " ";
		set1.erase(it);
	}
	cout << endl << endl;

	multiset<int, greater<int>> set2;
	for (int i = 0; i < 5; i++)
	{
		int tmp = rand();
		set2.insert(tmp);
	}
	//从大到小排序
	for (multiset<int, greater<int>>::iterator it = set2.begin(); it != set2.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	//2 自定义数据类型的比较 ===>仿函数 函数对象
	//Student s1("s1", 31);
	//Student s2("s2", 32);
	//Student s3("s3", 22);
	//Student s4("s4", 44);

	//multiset<Student, FuncStudent> setS1;
	//setS1.insert(s1);
	//setS1.insert(s2);
	//setS1.insert(s3);
	//setS1.insert(s4);
	遍历
	//for (multiset<Student, FuncStudent>::iterator it = setS1.begin(); it != setS1.end(); it++)
	//{
	//	cout << it->age << "\t" << it->name << endl;
	//}

	multiset<int> set3;
	for (int i = 0; i < 10; i++)
	{
		set3.insert(i + 1);
	}

	multiset<int>::iterator it0 = set3.find(5);
	cout << "*it0: " << *it0 << endl;

	int num1 = set3.count(5);
	cout << "num1: " << num1 << endl;

	multiset<int>::iterator it1 = set3.lower_bound(5);
	cout << "*it1: " << *it1 << endl;

	multiset<int>::iterator it2 = set3.lower_bound(5);
	cout << "*it2: " << *it2 << endl;

	//set3.erase(5);
	pair<multiset<int>::iterator, multiset<int>::iterator> myPair = set3.equal_range(5);
	multiset<int>::iterator it3 = myPair.first;
	cout << "*it3: " << *it3 << endl;//5 //6

	multiset<int>::iterator it4 = myPair.second;
	cout << "*it4: " << *it4 << endl << endl;//6 //6

	multiset<int> set4;
	int tmp;
	cout << "请输入multiset集合的值(输入0结束): ";
	cin >> tmp;
	while (tmp)
	{
		set4.insert(tmp);
		cout << "请输入multiset集合的值(输入0结束): ";
		cin >> tmp;
	}

	//遍历
	for (multiset<int>::iterator it = set4.begin(); it != set4.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

banjitino

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值