STL学习(1)- STL简介

博文内容是学习很多博客所总结的,类似学习笔记,如有错误欢迎指出!

大部分来自文章:http://www.cnblogs.com/ACMan/archive/2012/05/30/2526927.html


什么是STL


Standard Template Library (STL):标准模板库,更准确的说是 C++ 程序设计语言标准模板库。STL是所有C++编译器和所有操作系统平台都支持的一种库,说它是一种库是因为,虽然STL是一种标准,也就是说对所有的编译器来说,提供给C++程序设计者的接口都是一样的。也就是说同一段STL代码在不同编译器和操作系统平台上运行的结果都是相同的,但是底层实现可以是不同的。

所以我们可以把STL想象成摸鱼的工具,比如我们需要一组数据,使用的数据结构是栈,我们就不用单独写结构体(或者类),实现pop、push等方法,直接调用STL中的stack就可完成大部分操作。如果是ACM等竞赛的话,用好STL也能节省大部分时间。


STL的组成


STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),此外,还有容器适配器(container adaptor),函数对象(functor),STL其他标准组件。

容器


其实会Java的同学看见这个名字就知道怎么使用容器了- -,下面我们不介绍具体容器的使用、基本操作,比较 无聊理论地谈一下容器以及特点。

1.顺序容器(队列容器)
顺序容器按照线性排列来存储T类型值的集合,队列的每个成员都有自己的特有的位置。顺序容器有向量类型、双端队列类型、列表类型三种。即vector、deque、list。
学过数据结构的同学就可以理解了,这些容器的底层实现就是链表等顺序储存结构。
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。
deque和vector类似,支持快速随机访问。实际上是一个双端队列,vector只能从一段进行数据的操作,deque则是双端进行。
list是一个双向链表。

2.关联容器
关联容器按照一种映射关系来储存数据,可以想象成key-value的关系。关联容器有map、set这2中常用关联容器。
map 用唯一的关键字来映射相应的值,即具有key-value功能。底层实现是红黑树。
set是一组集合,同样底层实现是红黑树。

算法


算法属于STL,单独放在了algorithm库中。大部分算法都需要引用这个库,find等少数几个特殊的算法不需要。即:

#include<algorithm>

STL中算法的大部分都不作为某些特定容器类的成员函数,他们是泛型的,每个算法都有处理大量不同容器类中数据的使用。值得注意的是,STL中的算法大多有多种版本,用户可以依照具体的情况选择合适版本。中在STL的泛型算法中有4类基本的算法:
 1.变序型队列算法:可以改变容器内的数据;
 2.非变序型队列算法:处理容器内的数据而不改变他们;
 3.排序值算法:包涵对容器中的值进行排序和合并的算法,还有二叉搜索算法、通用数值算法。
 4.变序型队列算法:又叫可修改的序列算法。这类算法有复制(copy)算法、交换(swap)算法、替代(  replace)算  法、删除(clear)算法,移动(remove)算法、翻转(reverse)算法等等。这些算法可  以改变容器中的数据(数据值  和值在容器中的位置。
STL的算法并不只是针对STL容器,对一般容器也是适用的。所以用途十分广泛。

迭代器


迭代器实际上是一种泛化指针,如果一个迭代器指向了容器中的某一成员,那么迭代器将可以通过自增自减来遍历容器中的所有成员。迭代器是联系容器和算法的媒介,是算法操作容器的接口。在运用算法操作容器的时候,我们常常在不知不觉中已经使用了迭代器。一般来说,我们使用的迭代器都是相对于某一特殊容器的,例如:
vector<int>::iterator it;

我们声明的迭代器都是有确定的数据结构的。但是实际上,我们可以单独创建一个不依赖于任何容器的迭代器。所以说迭代器也有自己单独的库文件:

#include<iterator>

容器适配器


简单地说:容器适配器就是用某种顺序容器来实现(让已有的顺序容器以栈或者队列的方式工作)。在学习数据结构的时候,我们知道栈与队列是有特殊规则的顺序结构,栈的先进后出、队列的先进先出,其本质是一种规则。所以stack与queue被称为容器适配器,我们可以将list、vector等全部再添加到stack、queue中,以完成一些特殊的操作。

由于它们是容器适配器,所以与容器不同点就在于stack与queue没有属于自己的迭代器——对于stack而言,我们并不能找到一种方法来遍历,你只能pop出栈,或者push压栈。因为它们限定的是规则。

同理,STL中各种排序、查找、变序等算法都不适合容器适配器。

容器适配器是这3种:
 1.stack
2.queue
3.priority_queue
分别是栈、队列、优先队列。栈与队列都是顺序储存结构,优先队列则是利用了堆排序。

函数对象(仿函数)


由于博主也不是系统地学习C++(当成工具比赛用了。。)所以函数对象不敢妄言,下面的都是整理的笔记,有错误欢迎指正!

函数对象又称之为仿函数。函数对象将函数封装在一个对象中,使得它可作为参数传递给合适的STL算法,从而使算法的功能得以扩展。可以把它当作函数来使用。用户也可以定义自己的函数对象。我们在使用sort等算法的时候,第三个参数可以重新定义比较算法。此时我们有3种重新定义的方法:
 1.写函数,重新定义如何比较。
 2.重载操作符
 3.使用仿函数
在有的特殊容器的算法中,我们不能简单地写函数就行了,此时就只能重载操作符或者使用仿函数。但是本质上是重载操作符。

下面一个例子是令sort()排序的时候是降幂:

#include<iostream>
#include<algorithm>

using namespace std;

bool cmp(int x, int y) {
	return x > y;
}

int main() {
	int arr[5] = { 1,0,6,5,1 };
	sort(arr, arr + 5, cmp);
	for (int i = 0; i < 5; i++) {
		cout << arr[i] << endl;
	}

	system("pause");
	return 0;
}

同样,我们也可以重载操作符来修改排序,这里不再赘述。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值