C++中的STL简述

C++中的STL简述

STL概述

1、特性与组件

STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。
STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效。
STL中的三个基本组件:
1. 迭代器
迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。
2. 容器
容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。
3. 算法
算法是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。

2、头文件

为了避免和其他头文件冲突, STL的头文件不再使用常规的.h扩展。

3、命名空间

STL的sort()以及其他标志符都封装在名字空间std中。STL的sort()算法编译为std::sort(),从而避免了名字冲突。
尽管编译器可能没有实现名字空间,仍然可以使用他们。为了使用STL,可以将下面的指示符插入到你的源代码文件中,典型地是在所有的#include指示符的后面:

using namespace std;

迭代器

迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。例如,一个数组索引,也可以认为是一种迭代器。

迭代器有各种不同的创建方法。程序可能把迭代器作为一个变量创建。如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值。使用一个past-the-end值得指针来访问对象是非法的,就好像使用NULL或为初始化的指针一样。

2、迭代器类型

对于STL数据结构和算法,你可以使用五种迭代器。
· Input iterators 提供对数据的只读访问。

· Output iterators 提供对数据的只写访问

· Forward iterators 提供读写操作,并能向前推进迭代器。

· Bidirectional iterators提供读写操作,并能向前和向后操作。

· Random access iterators提供读写操作,并能在数据中随机移动。
当使用STL函数时,只能测试ip是否和past-the-end 值是否相等。尽管在本例中ip是一个C++指针,其用法也必须符合STL迭代器的规则。

容器迭代器

尽管C++指针也是迭代器,但用的更多的是容器迭代器。容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取迭代器对象。两个典型的容器类方法是begin()和end()。它们在大多数容器中表示整个容器范围。其他一些容器还使用rbegin()和rend()方法提供反向迭代器,以按反向顺序指定对象范围。
定义容器迭代器方法:

vector<int>::iterator intIter 

返回迭代器所指向的值:

*intIter 
常量迭代器

和指针一样,你可以给一个迭代器赋值。例如,首先申明一个迭代器:

vector<int>::iterator first;

该语句创建了一个vector类的迭代器。下面的语句将该迭代器设置到intVector的第一个对象,并将它指向的对象值设置为123::

first = intVector.begin();
*first = 123;

这种赋值对于大多数容器类都是允许的,除了只读变量。

算法

STL中,函数被称为算法,也就是说它们和标准C库函数相比,它们更为通用。STL算法通过重载operator()函数实现为模板类或模板函数。这些类用于创建函数对象,对容器中的数据进行各种各样的操作。
C++标准函数库中,为我们提供了一个algorithm库,里面包含了十分多的常用算法,下面我来做一个小小的总结:

非修改序列操作

adjacent_find   查找两个相邻(Adjacent)的等价(Identical)元素
all_of (C++11)  检测在给定范围中是否所有元素都满足给定的条件
any_of (C++11)  检测在给定范围中是否存在元素满足给定条件
count   返回值等价于给定值的元素的个数
count_if    返回值满足给定条件的元素的个数
equal   返回两个范围是否相等
find    返回第一个值等价于给定值的元素
find_end    查找范围 A 中与范围 B 等价的子范围最后出现的位置
find_first_of   查找范围 A 中第一个与范围 B 中任一元素等价的元素的位置
find_if 返回第一个值满足给定条件的元素
find_if_not (C++11) 返回第一个值不满足给定条件的元素
for_each    对范围中的每个元素调用指定函数
mismatch    返回两个范围中第一个元素不等价的位置
none_of (C++11) 检测在给定范围中是否不存在元素满足给定的条件
search  在范围 A 中查找第一个与范围 B 等价的子范围的位置
search_n    在给定范围中查找第一个连续 n 个元素都等价于给定值的子范围的位置

修改序列操作

copy    将一个范围中的元素拷贝到新的位置处
copy_backward   将一个范围中的元素按逆序拷贝到新的位置处
copy_if (C++11) 将一个范围中满足给定条件的元素拷贝到新的位置处
copy_n (C++11)  拷贝 n 个元素到新的位置处
fill    将一个范围的元素赋值为给定值
fill_n  将某个位置开始的 n 个元素赋值为给定值
generate    将一个函数的执行结果保存到指定范围的元素中,用于批量赋值范围中的元素
generate_n  将一个函数的执行结果保存到指定位置开始的 n 个元素中
iter_swap   交换两个迭代器(Iterator)指向的元素
move (C++11)    将一个范围中的元素移动到新的位置处
move_backward (C++11)   将一个范围中的元素按逆序移动到新的位置处
random_shuffle  随机打乱指定范围中的元素的位置
remove  将一个范围中值等价于给定值的元素删除
remove_if   将一个范围中值满足给定条件的元素删除
remove_copy 拷贝一个范围的元素,将其中值等价于给定值的元素删除
remove_copy_if  拷贝一个范围的元素,将其中值满足给定条件的元素删除
replace 将一个范围中值等价于给定值的元素赋值为新的值
replace_copy    拷贝一个范围的元素,将其中值等价于给定值的元素赋值为新的值
replace_copy_if 拷贝一个范围的元素,将其中值满足给定条件的元素赋值为新的值
replace_if  将一个范围中值满足给定条件的元素赋值为新的值
reverse 反转排序指定范围中的元素
reverse_copy    拷贝指定范围的反转排序结果
rotate  循环移动指定范围中的元素
rotate_copy 拷贝指定范围的循环移动结果
shuffle (C++11) 用指定的随机数引擎随机打乱指定范围中的元素的位置
swap    交换两个对象的值
swap_ranges 交换两个范围的元素
transform   对指定范围中的每个元素调用某个函数以改变元素的值
unique  删除指定范围中的所有连续重复元素,仅仅留下每组等值元素中的第一个元素。
unique_copy 拷贝指定范围的唯一化(参考上述的 unique)结果

划分

is_partitioned (C++11)  检测某个范围是否按指定谓词(Predicate)划分过
partition   将某个范围划分为两组
partition_copy (C++11)  拷贝指定范围的划分结果
partition_point (C++11) 返回被划分范围的划分点
stable_partition    稳定划分,两组元素各维持相对顺序

排序

is_sorted (C++11)   检测指定范围是否已排序
is_sorted_until (C++11) 返回最大已排序子范围
nth_element 部份排序指定范围中的元素,使得范围按给定位置处的元素划分
partial_sort    部份排序
partial_sort_copy   拷贝部分排序的结果
sort    排序(快速排序)
stable_sort 稳定排序

二分查找

binary_search   判断范围中是否存在值等价于给定值的元素
equal_range 返回范围中值等于给定值的元素组成的子范围
lower_bound 返回指向范围中第一个值大于或等于给定值的元素的迭代器
upper_bound 返回指向范围中第一个值大于给定值的元素的迭代器

合并(用于已排序的序列)

includes    判断一个集合是否是另一个集合的子集
inplace_merge   就绪合并
merge   合并
set_difference  获得两个集合的差集
set_intersection    获得两个集合的交集
set_symmetric_difference    获得两个集合的对称差
set_union   获得两个集合的并集

最大/最小值

is_permutation (C++11)  判断一个序列是否是另一个序列的一种排序 
max 返回两个元素中值最大的元素
max_element 返回给定范围中值最大的元素
min 返回两个元素中值最小的元素
min_element 返回给定范围中值最小的元素
minmax (C++11)  返回两个元素中值最大及最小的元素
minmax_element (C++11)  返回给定范围中值最大及最小的元素
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值