STL(下篇)

上篇我们简单的介绍了下STL概念,接下来,将对set 和 map 继续展开:

1、set :上篇我们讲到set的默认排序方式是从大到小的,在添加自定义类型时,由于编译器不知道怎么排序,我们需要重载()运算符来比较大小。

class MySort
{
public:
	// 重载()运算符,用来比较 student 的大小
	bool operator()(const Student &s1, const Student &s2)
	{
	//	return s1.id < s2.id;   // 从小到大
		return s1.id > s2.id;   // 从大到小
	}
};

1)set 返回值的判断:这里需要引入一个新的概念:对组    pair

	set<int> s;
	pair<set<int>::iterator, bool> ret =  s.insert(10);
 第一个参数是迭代器,返回的插入成功的数据的迭代器,第二个参数是一个bool类型,表明插入成功还是失败,使用的时候 用 first 代表第一个参数,second 代表第二个参数

2)set 的查找:

1、find:返回迭代器,如果找到指向返回指向找到的元素的迭代器,如果找不到,返回指向 end() 的迭代器

2、s.lower_bound:下边界查找,查找>=n 的元素,返回第一个符合要求的元素

3、s.upper_bound:上边界查找,查找>n  的元素,返回第一个符合要求的元素

4、s.equal_range:范围查找,返回一个对组,包含2个迭代器,分别对应>= 和 > ;由于没有重复的,在set中这样的查找方式没有很大的用处。

3)multiset:允许有重复元素,其他用法与set一致。


2、map :关联式容器,里面存放键值对,键可以是任意类型。键值key值是唯一的,内部元素通过键值从小到大排序

1)map 的插入:可以用返回值接以判断是否成功,类型为 pair 对组。

	pair<map<string,int>::iterator,bool> ret;
	ret = m.insert(pair<string,int>("AA",6));		// 1、通过构建pair 对组进行插入
	ret = m.insert(make_pair("FF", 8));			// 2、通过make_pair 来构建数据
	ret = m.insert(map<string,int>::value_type("GG",3));	// 3、通过map 的值类型插入

以上3种方式都能通过ret 的第二个参数来判断是否插入成功,此外,还有一种插入方式:

	m["KK"] = 9;
这种方式可以增加,但若已存在,则修改原元素的值。

2)map 的查找:查找的是键,find

3)map 的删除:erase,通过键删除或通过迭代器

4)multimap:键可以重复,常被使用,用作分组很常见


下面是,算法以及算法中函数对象和谓词的介绍:

1、函数对象:当一个类中重载了()运算符,表现形式很像函数时,称为函数对象或仿函数;

2、遍历算法:for_each 实现,例如建了PrintA 函数模板,PrintB普通函数,Show 模板类三种形式:

	vector<int> v;
	for_each(v.begin(), v.end(), PrintB); 
	for_each(v.rbegin(), v.rend(), PrintA<int>);
	for_each(v.begin(), v.end(), ShowElement<int>());	// 实际上是一个匿名对象
函数对象可以保存操作状态,自定义一些操作:
	ShowElement<int> show;
	// 在 算法中 传递 函数对象是 值传递不是引用传递 在内部是无法改变传过去的对象的值
	// 部分算法会返回 函数对象
	show = for_each(v.begin(), v.end(), show);
	show.print();

3、一元谓词,谓词:函数 或者 函数对象 返回值是bool 类型

条件查找:find_if

	vector<int>::iterator it
	it = find_if(v.begin(), v.end(), isDiv);    //  需要一个一元谓词
	cout << *it << endl;

	it = find_if(v.begin(), v.end(), MyDiv());    //  需要一个一元谓词
	cout << *it << endl;
4、排序算法:sort (v.begin() , v.end(), MyCompare())

然后另外在MyCompare 中重载() 运算符

class MyCompare
{
public:
	// 二元谓词
	bool operator()(int left, int right)
	{
		// return left > right;    // 从大到小进行排序
		return left < right;
	}
};

5、预定义函数:#include <functional>

标准模板库中提前定义了很多预定义函数,包括 加法plus、减法minus、求余modulus、求反negate等算数函数对象,等于equal_to、大于greater、小于less等关系函数以及逻辑与logical_and等逻辑函数对象

6、函数适配器:用来特殊化或者扩展一元和二元函数对象。常用的有下面4种:

1)bind1st(op, value) // 将一个固定值绑定到二元函数对象的第一个参数

	// bind1st(equal_to<string>(),"aa")  ==> equal_to<string>("aa",string right)
第二个参数还是需要的

2)bind2nd(op,value) // 将一个固定值绑定到二元函数对象的第二个参数

3)not1(op) // 一元函数谓词 ,用来取反

4)not2 (op) // 二元函数谓词







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值