Set和multiset容器

1、set是一个集合容器,其所包含的元素是唯一的,元素按顺序排列,不支持在指定位置插入元素,不可以直接存取元素。

2、multiset与set的区别:set容器中元素唯一,而multiset支持中支持同一值出现多次。

3、不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。

  • #include <set>

set的插入与迭代器

  • set.insert(elem);     //在容器中插入元素。
  • set.begin();            //返回容器中第一个数据的迭代器。
  • set.end();               //返回容器中最后一个数据之后的迭代器。
  • set.rbegin();           //返回容器中倒数第一个元素的迭代器。
  • set.rend();              //返回容器中倒数最后一个元素的后面的迭代器。

set集合的元素排序

  • set<int,less<int> >  setIntA;                 //该容器是按升序方式排列元素。
  • set<int,greater<int>> setIntB;              //该容器是按降序方式排列元素。
  • set<int> 相当于 set<int,less<int>>

set对象的拷贝构造与赋值

  • set(const set &st);                                //拷贝构造函数
  • set& operator=(const set &st);             //重载等号操作符
  • set.swap(st);                                        //交换两个集合容器

set的大小

  • set.size();                //返回容器中元素的数目
  • set.empty();             //判断容器是否为空

set的删除

  • set.clear();                       //清除所有元素
  • set.erase(pos);                //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • set.erase(beg,end);         //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • set.erase(elem);              //删除容器中值为elem的元素。

set的查找

  • set.find(elem);                     //查找elem元素,返回指向elem元素的迭代器。
  • set.count(elem);                  //返回容器中值为elem的元素个数。对set来说只存在1个或0个。对multiset来说,值可能大于1。
  • set.lower_bound(elem);      //返回第一个>=elem元素的迭代器。
  • set.upper_bound(elem);     //返回第一个>elem元素的迭代器。
  • set.equal_range(elem);      //返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)

pair的使用

  • pair译为对组,可以将两个值视为一个单元。
  • pair<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。
  • pair.first是pair里面的第一个值,是T1类型。
  • pair.second是pair里面的第二个值,是T2类型。

set基本用法

void Fun1()
{
	set<int> s1;
	//set<int,less<int>> s1;//升序
	//set<int, greater<int>> s1;//降序
	/*cout << "输入一组数,输入的值不能重复出现:" << endl;
	int num = 0;
	scanf("%d", &num);
	while (num != 0)
	{
		s1.insert(num);
		scanf("%d", &num);
	}*/
	for (int i = 0; i <10;i++)
	{
		s1.insert(rand());
	}

	cout << "插入到set集合后得到的结果:(默认为升序)" << endl;

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

	cout << "删除" << endl;
	set<int, less<int>>::iterator it = s1.begin();
	it++;
	it++;
	s1.erase(it);

	for (set<int, less<int>>::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	set<int> s2;
	for (int i = 0; i < 10; i++)
	{
		s2.insert(i+1);
	}
	cout << "查找" << endl;
	set<int>::iterator it1 = s2.find(5);
	cout << *it1 << endl;

	int count = s2.count(5);
	cout <<"元素5的个数:"<< count << endl;

	set<int>::iterator it2;
	it2 = s2.lower_bound(5);
	cout <<"返回第一个>=5的元素:"<< *it2 << endl;

	it2 = s2.upper_bound(5);
	cout << "返回第一个>5的元素:" << *it2 << endl;
	cout << endl;
	//using _Pairii = pair<iterator, iterator>;
	pair<set<int>::iterator, set<int>::iterator> pairit = s2.equal_range(5);
	cout << "输出与元素5相等的上下限" << endl;
	set<int>::iterator it3 = pairit.first;
	cout << "上限:" << *it3 << endl;

	set<int>::iterator it4 = pairit.second;
	cout << "下限:" << *it4 << endl;
}

函数对象functor的用法(仿函数)

设想如果set集合里面插入一个班级的考试成绩,想得到成绩最大到小排列

相当于简易版的greater<int>函数对象

容器就是调用函数对象的operator()方法去比较两个值的大小。

class Student
{
public:
	Student(const int grade, const char *name)
	{
		this->m_grade = grade;
		strcpy(m_name, name);
	}

public:
	int		m_grade;
	char	m_name[64];
};

struct RankFun
{
	bool operator()(const Student &iStu1,const Student &iStu2)
	{
		return(iStu1.m_grade > iStu2.m_grade);
	}
};

void Fun2()
{
	multiset<Student, RankFun> sStu;
	sStu.insert(Student(85, "小冯"));
	sStu.insert(Student(81, "小张"));
	sStu.insert(Student(90, "小徐"));
	sStu.insert(Student(95, "小尹"));
	sStu.insert(Student(88, "小廖"));
	sStu.insert(Student(80, "小吴"));
	sStu.insert(Student(90, "小龚"));
	sStu.insert(Student(95, "小王"));
	sStu.insert(Student(85, "小李"));

	cout << "按成绩排名" << endl;
	for (multiset<Student, RankFun>::iterator it = sStu.begin();it != sStu.end();it++)
	{
		cout << it->m_name << ": " << it->m_grade << endl;
	}
}

总结:

一、容器set/multiset的使用方法;

红黑树的变体,查找效率高,插入不能指定位置,插入时自动排序。

二、functor的使用方法;

类似于函数的功能,可用来自定义一些规则,如元素比较规则。

三、pair的使用方法。

对组,一个整体的单元,存放两个类型(T1,T2,T1可与T2一样)的两个元素。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章