【学习笔记】《STL使用入门教程》第四讲:容器set、函数对象functor与对组pair

晓石头的博客
邮箱:178673693@qq.com
转载请注明出处,原文链接:http://blog.csdn.net/qiulanzhu/article/details/50491759


1set/multiset的介绍

①.set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。
元素插入的过程是按排序规则插入,所以不能指定插入位置

②.set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。
在插入和删除操作上比vector快。

③.set不可以直接存取元素。(也就是不可以使用.at[idx]与[]操作符)

④.不可以直接修改set或者multiset容器中的元素值,因为该容器是自动排序的。
如果希望修改一个元素值,需先删除再插入。

⑤.multiset与set的区别:
set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。 


2set/multiset对象的默认构造

set采用模版类实现,set/multiset对象的默认构造形式:set<T>setT;multiset<T>multisetT;

set<int> setInt;//存放intset容器

set<float> setFloat;//存放floatset容器

set<string> setString;//存放stringset容器

multiset<int> multisetInt;//存放intmultiset容器

multiset<float> multisetFloat;//存放floatmultiset容器

multiset<string> multisetString;//存放stringmultiset容器

...

//尖括号内可以是各种指针类型或者自定义类型。

 

3set对象的拷贝构造

set(const set &st);//拷贝构造函数

set &operator=(const set &st);//重载等于操作

 

 

4set的插入

set.insert(elem);//容器中插入元素

 

5set的取值

set.begin();//返回容器中第一个数据的迭代器

set.end();//返回容器中最后一个数据再后面一个元素的迭代器

set.rbegin();//返回容器中倒数第一个数据的迭代器

set.rend();//返回容器中倒数最后一个数据再后面一个元素的迭代器

 

6set控制排序方式

set<int, less<int>> setInt;//按升序方式排列元素

set<int, greater<int>> setInt;//按降序方式排列元素

set<int> 相当于set<int, less<int>>

 

7set自定义排序规则,函数对象functor的用法

例:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <set>

using namespace std;

class Student
{
public:
	Student(int id, string name):m_id(id),m_name(name){}
public:
	int m_id;
	string m_name;
};

struct studentFunctor
{
	bool operator()(const Student &stu1, const Student &stu2)
	{
		return (stu1.m_id < stu2.m_id);
	}
};


int main(int argc, char* argv[])
{
	set<Student, studentFunctor> setStudent;

	setStudent.insert(Student(3, "小明3"));
	setStudent.insert(Student(5, "小明5"));
	setStudent.insert(Student(2, "小明2"));
	setStudent.insert(Student(1, "小明1"));
	setStudent.insert(Student(4, "小明4"));

	set<Student, studentFunctor>::iterator it;
	for(it=setStudent.begin(); it!=setStudent.end(); it++)
	{
		cout<<(*it).m_name<<" "<<endl;
	}

	return 0;
}

 


8set的大小

set.seze();//容器中元素的数目

set.empty();//判断容器是否为空

 

9set的删除---删

set.clear();//清除所有元素

set.erase(pos);//删除pos位置的元素,返回下一个元素的位置(迭代器)

set.erase(beg, end);//删除区间[beg, end)的元素,返回下一个元素的迭代器

set.erase(elem);//删除容器中值为elem的元素

 

10set对象交换容器里的元素---改

set.swap(st);//等价于swap(set, st);

 

11set的查找---查

set.find(elem);//查找elem元素,返回指向elem元素的迭代器

set.count(elem);//返回容器中值为elem的元素个数。set的查找结果为01multiset结果>=0

set.lower_bound(elem);//返回第一个>=elem元素的迭代器

set.upper_bound(elem);//返回第一个>elem元素的迭代器

set.equal_range(elem);//返回两个迭代器,一个指向>=elem的元素;另一个指向>elem的元素。两个迭代器被封装在一个pair中。

 

12pair的介绍

pair:对组,将两个值视为一个单元。

pair<T1, T2>:T1T2两个类型可以不一样。

如:T1int,T2floatT1T2也可以是自定义类型。

pair.firstpair里的第一个值,是T1类型;

pair.secondpair里的第二个值,是T2类型。

 

例子:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <set>

using namespace std;

int main(int argc, char* argv[])
{
	set<int> setInt;
	setInt.insert(1);
	setInt.insert(3);
	setInt.insert(5);
	setInt.insert(7);
	setInt.insert(9);

	pair<set<int>::iterator, set<int>::iterator>> itPair = setInt.equal_range(3);//elem=3结果输出3、5;elem=2结果输出3、3

	cout<<*(itPair.first)<<endl;
	cout<<*(itPair.second)<<endl;

	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值