标准模板库STL

在标准库中,容器、迭代器、算法和数值操作合称为标准模板库。

STL是一个具有工业强度的,高效的C++程序库 

它实现了诸多在计算机科学领域里常用的基本数据结构 和基本算法 

(1)<algorithm>:提供给了通用的算术算法和STL的一般算法。

sort:以升序重新排列范围内的元素

swap:交换存储在两个对象中的值

max_element:指出序列中最大的元素

find:对范围内的元素进行查找

copy:复制序列

replace:将范围内所有的old_value的元素都用new_value替代

(2)<numeric>:提供给了4类对序列进行数字处理的算法。

accumulate():累加

product():内乘

Partial_sum():部分和

adjacent_difference():邻接差值


STL主要包含了容器、算法、迭代器

容器

是容纳、包含相同类型元素的对象,主要用类模板实现 

 序列型容器:容器中的元素按线性结构组织起来,可以 逐个读写元素。主要代表有vector(向量)、deque(双端 队列) 、list(双向链表)

 关联型容器:关联容器通过键(key)存储和读取元素。 主要有map(映射)、set(集合)等

容器适配器:是对前面提到的某些容器(如vector)进行 再包装,使其变为另一种容器。典型的有栈(stack)、 队列(queue)等

迭代器

是用于确定元素位置的数据类型,可用来遍历容器中的元素 

通过迭代器可以读取、修改它指向的元素,它的用法和指针 类似

每一种容器都定义了一种迭代器

算法

由许多函数模版组成的集合,实现了大量通用算法,用 于操控各种容器
STL中提供的算法涉及到:比较、交换、查找、遍历 、复制、修改、移除、反转、排序、合并等。大约有 70种标准算法

算法通过迭代器来操纵容器中的元素 

算法可以处理容器,也可以处理C语言的数组

向量Vector

迭代器是一种允许检查容器内元素,并实现元素遍历的数据类型。迭代器提供了比下标操作更一般化的方法:所有的标准库容器都定义了相应的迭代器类型,只有少数容器支持下标操作。因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素。

vector 实际上就是对动态数组封装 

可以像数组一样可以使用下标访问元素,若vector 长度为n,则其下标为 0~n-1

根据下标访问元素效率高 

vector对象的空间随着插入删除操作自动调整 

因为空间自动调整比较耗费时间,因此频繁插入删 除的情况下,vector效率稍差

向量vector是C++标准模板库中的内容。vector是一个容器,它能存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。

c.size()

返回元素个数

c.empty()

判断容器是否为空

c.max_size()

返回元素最大可能数量(固定值)

c.capacity()

返回重新分配空间前可容纳的最大元素数量

c.reserve(n)

扩大容量为n

c1==c2

判断c1是否等于c2

c1!=c2

判断c1是否不等于c2

c1<c2

判断c1是否小于c2

c1>c2

判断c1是否大于c2

c1<=c2

判断c1是否大于等于c2

c1>=c2

判断c1是否小于等于c2

操作

效果

c1 = c2

c2的全部元素赋值给c1

c.assign(n,e)

将元素en个拷贝赋值给c

c.assign(beg,end)

将区间[beg,end]的元素赋值给c

c1.swap(c2)

c1c2元素互换

swap(c1,c2)

同上,全局函数


使用向量,需要在程序中添加<vector>头文件。

向量类成员函数原型如下:

迭代器iterators

iterator begin();//返回向量第一个元素为迭代器起始

iterator end();//返回向量末尾元素为迭代器结束

reverse_iterator rbegin();//返回向量末尾元素为逆向迭代器起始

reverse_iterator rend();//返回向量第一个元素为逆向迭代器结束

容量capacity

size_type size();//返回向量元素数目

size_type max_size();//返回向量能容纳的最大元素数目

viod resize(size_type sz,T c=T());//重置向量长度为sz,c填充到扩充元素中

size_type capacity();//返回向量容器存储空间大小

bool empty();//测试向量是否为空

void reserve(size_type n);//为向量申请能容纳n个元素的空间

元素存取element access

operator[](size_type n);//返回向量第n个位置元素的运算符,n从 0起

at(size_type n);//返回向量第n个元素,n从0起

front();//返回向量第一个元素

back();//返回向量末尾元素

begin()和end()函数
 每种容器都定义了一对命名为begin和end的函数,用于返回 迭代器。如果容器中有元素,由begin返回的迭代器指向第一 个元素:
it = v1.begin(); // 指向v1[0]
 由 end 返回的迭代器指向vector的末端元素的下一个。通常 称为超出末端迭代器,表明它指向了一个丌存在的元素 it = v1.end(); // 指向末端元素的下一个

 如果vector为空,begin返回的迭代器不end返回的迭代器相同

以迭代器为参数的插入删除函数

v.insert(p,t) 在迭代器p所指向的元素前面插入值为 t 的元素 

v.insert(p,n,t) 在迭代器p所指向的元素前面插入n个值为t的新元素 

v.insert(p,b,e) 在迭代器p所指向的元素前面插入迭代器b和e标记的范围内的元素

v.erase(p) 删除迭代器p指向的容器中的元素

v.erase(b,e) 删除迭代器b和e所标记范围内的元素

map容器

pair类型
pair 类定义在 <utility> 头文件中。pair 是一个类模板, 它将两个值组织在一起,这两个值的类型可丌同。可以通 过 first 和 second 公共数据成员来访问这两个值

pair对象常常作为元素被添加到map中 

pair对象的定义: pair<int, string> mypair(5 , "Jack"); //调用构造函数 pair<int, string> otherPair ; // 直接赋值 otherPair.first = 6; otherPair.second = “Mike";

函数模板 make_pair( ) 能从两个变量构造一个 pair pair<int, int > aPair = make_pair( 5, 10 ) ;

map创建及添加元素  map 类定义在 <map> 头文件中
创建map对象: map<int, string> StuInfo; 这就定义了一个用int作为键, 相关联string为值的map

插入pair对象: pair<int, string> mypair(1, "Tom"); StuInfo.insert(mypair); StuInfo.insert(pair<int, string>(5, "Jack"));*

排序和查找算法

find

template<class InIt,class T>

InItfind(InItfirst, InItlast, const T& val);

返回区间 [first,last)中的迭代器i,使得*i== val

find_if

template<class InIt,class Pred>

InItfind_if(InItfirst, InItlast, Predpr);

返回区间 [first,last)中的迭代器i,使得pr(*i)== true

知识点过于杂乱。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页