STL——set容器

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<set>//multset也是这个头文件
#include<algorithm>
#include<string>

void test()
{
	set<int>::iterator it;
	it++;
	it--;
	//it + 2;err
	//双向迭代器
}

void printSet(set<int> &s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}
/*
构造函数
set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数

赋值操作
set&operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空

插入和删除操作
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。


*/

void test01()
{
	set<int> s;
	s.insert(4);
	s.insert(8);
	s.insert(2);
	s.insert(10);
	s.insert(7);
	//自身规则进行排序,从小到大
	printSet(s);


}

struct myfunc
{
	bool operator()(int v1,int v2)
	{
		return v1 > v2;
	}
};
void printSet2(set<int, myfunc> &s)
{
	for (set<int, myfunc>::iterator it = s.begin(); it != s.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}
//改变set容器的规则,变为降序(从大到小)
void test02()
{
	set<int, myfunc> s;
	s.insert(4);
	s.insert(8);
	s.insert(2);
	s.insert(10);
	s.insert(7);

	printSet2(s);
}


//set容器不允许有两个相同的元素
void test03()
{

	set<int, myfunc> s;
	s.insert(4);
	s.insert(8);
	s.insert(2);
	s.insert(10);
	s.insert(7);

	printSet2(s);
	//注意:set容器不允许有两个相同的元素,但是插入相同的元素,编译不会报错,运算也不报错
	//只是不把数据输入容器
	s.insert(8);
	printSet2(s);

	pair<set<int,myfunc>::iterator, bool> ret=s.insert(11);

	if (ret.second)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}

	s.erase(2);
	s.erase(s.begin());
	printSet2(s);
}
void print(int v)
{
	cout << v << " ";
}
//不能通过算法排序
void test04()
{
	multiset<int> s;
	s.insert(4);
	s.insert(8);
	s.insert(2);
	s.insert(2);
	s.insert(7);
	//自身规则进行排序,从小到大
	//不能通过算法排序来排序关联式容器的元素
	//sort(s.begin(), s.end());

	for_each(s.begin(), s.end(), print);
	cout << endl;

}
/*
查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
1.	count(key);//查找键key的元素个数
2.	lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
3.	upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

*/
void test05()
{
	set<int> s;
	s.insert(4);
	s.insert(8);
	s.insert(6);
	s.insert(9);
	s.insert(7);
	set<int>::iterator it=s.find(10);
	if (it == s.end())
	{
		cout << "查找失败" << endl;
	}
	else
	{
		cout << "查找成功:" << *it << endl;
	}
	//查找大于等于2的最小的数
	it = s.lower_bound(2);
	if (it == s.end())
	{
		cout << "查找失败" << endl;
	}
	else
	{
		cout << "查找成功:" << *it << endl;
	}
	//查找大于2的最小的数
	it = s.upper_bound(2);
	if (it == s.end())
	{
		cout << "查找失败" << endl;
	}
	else
	{
		cout << "查找成功:" << *it << endl;
	}
	//返回大于等于2的两个最小的数,如果有2那么就返回2和大于2的最小数
	pair<set<int>::iterator,set<int>::iterator> ret=s.equal_range(2);
	cout << *(ret.first) << endl;
	cout << *(ret.second) << endl;

	multiset<int> s1;
	s1.insert(4);
	s1.insert(4);
	s1.insert(4);
	s1.insert(9);
	s1.insert(7);

	cout << s1.count(4) << endl;
}

//存储对象时,需要告诉set容器规则
class Maker
{
public:
	Maker(string name,int age)
	{
		this->name = name;
		this->age = age;
	}
public:
	string name;
	int age;
};

struct Makerfunc
{
	bool operator()(const Maker &m1,const Maker &m2)
	{
		return m1.age > m2.age;
	}
};
void test06()
{
	set<Maker, Makerfunc> s;
	s.insert(Maker("aaa", 18));
	s.insert(Maker("bbb", 19));
	s.insert(Maker("ccc", 20));
	s.insert(Maker("ddd", 21));
	s.insert(Maker("eee", 22));

	for (set<Maker, Makerfunc>::iterator it = s.begin(); it != s.end(); ++it)
	{
		cout << "Name:" << it->name << " Age:" << it->age << endl;
	}
}
int main()
{
	test06();
	system("pause");
	return EXIT_SUCCESS;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值