C++中的STL

一、概念
STL(Standard Template Library),即标准模板数据库,是一个具有高效开发强度的C++程序库,它包含了在计算机领域所常见 的基本数据结构和基本算法。
STL的一个重要特点是数据结构和算法的分离。比如,STL中的sort()是通用的,既可以对数据进行排序,也可以对链表等结构进行排序。
二、六大组件
1.容器(Container):是一种数据结构,比如list、vector、deques,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。
(1)序列式容器,每个元素都有固定位置,取决于插入时机和地点,和元素值无关,vector、deque、list
vector:将元素置于一个动态数组中进行管理,可以随机存取元素(通过索引进行存取),数组尾部添加或者删除元素非常快速,但是在头部和中部插入元素比较慢。
deque:"double-ended queue"的缩写,可以随机存取元素(通过索引直接存取),数组头部和尾部添加或者删除元素特别快,中部和头部插入元素比较慢。
list:双向链表,不提供随机存取(按顺序走到需要存取的元素,O(N)时间复杂度),在任何位置上执行插入和删除都非常快,内部秩序调整一下指针。
(2)关联式容器,元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap。
set/multiset:内部的元素一句其值自动排序,set内的相同数值的元素只能出现一次,multiset内可包含多个值相同的数值,内部由二叉树实现,便于查找。
map/multimap:map的元素是成对的键值(键值对),内部的元素一句其值自动排序,map内的相同数值的元素只能出现一次,multimap中可包含多个数值相同的元素,内部由二叉树实现,便于查找。

void test()
{
	//定义和初始化
	vector<int> v1;
	vector<int> v2(v1);//使用v1初始化v2
	vector<int> v3(v1.begin(), v1.end());//使用v1初始化v3
	vector<int> v4(10);//申请10个空间。值默认为0
	vector<int> v5(2,4);//申请2个空间。值为4
	//常用操作方法
	v1.push_back(10);//插入元素10
	int size = v1.size();//v1大小
	bool isEmpty = v1.empty();//判空
	cout << v1[0] << endl;//也可以写为*(v1.bedin())
	v1.insert(v1.end(), 2, 4);//在v1的末尾插入2个值为4的元素
	v1.pop_back();//删除末尾元素
	v1.erase(v1.begin(), v1.end());//删除之间的元素,其他元素前移
	v1.clear();//清空元素

	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	//遍历
	//下标
	int length = v1.size();
	for (int i = 0; i < length; i++)
	{
		cout << v1[i];
	}
	cout << endl;
	//迭代器法
	vector<int>::const_iterator iterator = v1.begin();
	for (; iterator != v1.end(); iterator++)
	{
		cout << *iterator;
	}
}

2.迭代器(Iterator):提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象,迭代器就如同一个指针。事实上,C++的指针也是一种迭代器,但是迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符的方法的类对象。
Iterator模式又称为Cursor(游标)模式,是用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。
迭代器的作用:能够让迭代器与算法互不干扰的相互发展,最后又能无间隙的粘合起来,重载了*,++,==,!=,=运算符,用于操作复杂的数据结构,容器提供迭代器;常见的迭代器类型:iterator、const_iterator、reverse_iterator、const_reverse_iterator。

void test1()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	for (vector<int>::iterator i = v1.begin(); i != v1.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;
	v1.insert(v1.begin(), 8);//在第一个元素之前插入8
	v1.insert(v1.end(), 6); //在最后一个元素之后插入6
	for (vector<int>::iterator i = v1.begin(); i != v1.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;
}

3.算法(Algorithm):是用来操作容器中的数据的模板函数。用sort()函数对vector中的数据进行排序,用find()函数对list中的一个对象进行搜索。函数本身与它们操作的数据结构和类型无关,所以它们可以对数据进行操作,也可以对链表进行操作。
算法主要由头文件algorithm、numeric、functional组成。
algorithm:是STL所有头文件最大的一个,是由一大堆模板函数组成,常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并。
numeric:这个相对较少,只包括几个在序列上面进行简单数学运算的模板函数,包括加法减法在序列上的操作。
functional:定义了一些模板类,用于声明函数对象。
(一)查找算法
adjacent_find:在iterator对标识元素范围内,查找一对相邻重复元素。
binary_search:在有序序列中查找value,找到返回true。
count:利用操作符,把标识范围内的元素与载入值相比较,返回相等元素的个数。
count_if: 利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。
equal_range: 功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。
find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIterator。
find_end: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。
find_first_of: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符。
find_if: 使用输入的函数代替等于操作符执行find。
lower_bound: 返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函数使用自定义比较操作。
upper_bound: 返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志一个大于value的值。重载函数使用自定义比较操作。
search: 给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置,查找失败指向last1。重载版本使用自定义的比较操作。
search_n: 在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。
(二)排序和通用算法(14个):提供元素排序策略
inplace_merge: 合并两个有序序列,结果序列覆盖两端范围。重载版本使用输入的操作进行排序。
merge: 合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较。
nth_element: 将范围内的序列重新排序,使所有小于第n个元素的元素都出现在它前面,而大于它的都出现在后面。重载版本使用自定义的比较操作。
partial_sort: 对序列做部分排序,被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作。
partial_sort_copy: 与partial_sort类似,不过将经过排序的序列复制到另一个容器。
partition: 对指定范围内元素重新排序,使用输入的函数,把结果为true的元素放在结果为false的元素之前。
random_shuffle: 对指定范围内的元素随机调整次序。重载版本输入一个随机数产生操作。
reverse: 将指定范围内元素重新反序排序。
reverse_copy: 与reverse类似,不过将结果写入另一个容器。
rotate: 将指定范围内元素移到容器末尾,由middle指向的元素成为容器第一个元素。
rotate_copy: 与rotate类似,不过将结果写入另一个容器。
sort: 以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作。
stable_sort: 与sort类似,不过保留相等元素之间的顺序关系。
stable_partition: 与partition类似,不过不保证保留容器中的相对顺序。
(三)删除和替换算法(15个)
copy: 复制序列
copy_backward: 与copy相同,不过元素是以相反顺序被拷贝。
iter_swap: 交换两个ForwardIterator的值。
remove: 删除指定范围内所有等于指定元素的元素。注意,该函数不是真正删除函数。内置函数不适合使用remove和remove_if函数。
remove_copy: 将所有不匹配元素复制到一个制定容器,返回OutputIterator指向被拷贝的末元素的下一个位置。
remove_if: 删除指定范围内输入操作结果为true的所有元素。
remove_copy_if: 将所有不匹配元素拷贝到一个指定容器。
replace: 将指定范围内所有等于vold的元素都用vnew代替。
replace_copy: 与replace类似,不过将结果写入另一个容器。
replace_if: 将指定范围内所有操作结果为true的元素用新值代替。
replace_copy_if: 与replace_if,不过将结果写入另一个容器。
swap: 交换存储在两个对象中的值。
swap_range: 将指定范围内的元素与另一个序列元素值进行交换。
unique: 清除序列中重复元素,和remove类似,它也不能真正删除元素。重载版本使用自定义比较操作。
unique_copy: 与unique类似,不过把结果输出到另一个容器。
(四)排列组合算法(2个):提供计算给定集合按一定顺序的所有可能排列组合
next_permutation: 取出当前范围内的排列,并重新排序为下一个排列。重载版本使用自定义的比较操作。
prev_permutation: 取出指定范围内的序列并将它重新排序为上一个序列。如果不存在上一个序列则返回false。重载版本使用自定义的比较操作。
(五)算术算法(4个)
accumulate: iterator对标识的序列段元素之和,加到一个由val指定的初始值上。重载版本不再做加法,而是传进来的二元操作符被应用到元素上。
partial_sum: 创建一个新序列,其中每个元素值代表指定范围内该位置前所有元素之和。重载版本使用自定义操作代替加法。
inner_product: 对两个序列做内积(对应元素相乘,再求和)并将内积加到一个输入的初始值上。重载版本使用用户定义的操作。
adjacent_difference: 创建一个新序列,新序列中每个新值代表当前元素与上一个元素的差。重载版本用指定二元操作计算相邻元素的差。
(六)生成和异变算法(6个)
fill: 将输入值赋给标志范围内的所有元素。
fill_n: 将输入值赋给first到first+n范围内的所有元素。
for_each: 用指定函数依次对指定范围内所有元素进行迭代访问,返回所指定的函数类型。该函数不得修改序列中的元素。
generate: 连续调用输入的函数来填充指定的范围。
generate_n: 与generate函数类似,填充从指定iterator开始的n个元素。
transform: 将输入的操作作用与指定范围内的每个元素,并产生一个新的序列。重载版本将操作作用在一对元素上,另外一个元素来自输入的另外一个序列。结果输出到指定容器。
(七)关系算法(8个)
equal: 如果两个序列在标志范围内元素都相等,返回true。重载版本使用输入的操作符代替默认的等于操作符。
includes: 判断第一个指定范围内的所有元素是否都被第二个范围包含,使用底层元素的<操作符,成功返回true。重载版本使用用户输入的函数。
lexicographical_compare: 比较两个序列。重载版本使用用户自定义比较操作。
max: 返回两个元素中较大一个。重载版本使用自定义比较操作。
max_element: 返回一个ForwardIterator,指出序列中最大的元素。重载版本使用自定义比较操作。
min: 返回两个元素中较小一个。重载版本使用自定义比较操作。
min_element: 返回一个ForwardIterator,指出序列中最小的元素。重载版本使用自定义比较操作。
mismatch: 并行比较两个序列,指出第一个不匹配的位置,返回一对iterator,标志第一个不匹配元素位置。如果都匹配,返回每个容器的last。重载版本使用自定义的比较操作。
(八)集合算法(4个)
set_union: 构造一个有序序列,包含两个序列中所有的不重复元素。重载版本使用自定义的比较操作。
set_intersection: 构造一个有序序列,其中元素在两个序列中都存在。重载版本使用自定义的比较操作。
set_difference: 构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。重载版本使用自定义的比较操作。
set_symmetric_difference: 构造一个有序序列,该序列取两个序列的对称差集(并集-交集)。
(九)堆算法(4个)
make_heap: 把指定范围内的元素生成一个堆。重载版本使用自定义比较操作。
pop_heap: 并不真正把最大元素从堆中弹出,而是重新排序堆。它把first和last-1交换,然后重新生成一个堆。可使用容器的back来访问被"弹出"的元素或者使用pop_back进行真正的删除。重载版本使用自定义的比较操作。
push_heap: 假设first到last-1是一个有效堆,要被加入到堆的元素存放在位置last-1,重新生成堆。在指向该函数前,必须先把元素插入容器后。重载版本使用指定的比较操作。
sort_heap: 对指定范围内的序列重新排序,它假设该序列是个有序堆。重载版本使用自定义比较操作。

#include<algorithm>

void test2()
{
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v2.push_back(i);
	}
	for (vector<int>::iterator i = v2.begin(); i != v2.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;
	reverse(v2.begin(), v2.end());
	for (vector<int>::iterator i = v2.begin(); i != v2.end(); ++i)
	{
		cout << *i << " ";
	}
}

4.仿函数(Function object):
5.迭代适配器:
6.空间配置器:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值