您的位置:首页 > 其它

STL(下篇)

2017-10-09 19:21 82 查看
上篇我们简单的介绍了下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)
// 二元函数谓词
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: