序列是有序的,可以使用二分查找:
···
low = 0;
high = n - 1;
while (low <= high)
{
int mid = (high - low) / 2;
if (key == list[mid];
return 0;
else
{
if (key < list[mid])
{
high = mid - 1;
}
else
low = mid + 1;
}
return -1;
}
···
类模板可以容纳不同类型的对象,这些不同类型的对象的共同特征:处理这些对象中的数据成员的算法逻辑基本上是一致的,也就是说一个类模板,其中的函数都是模板函数。
容器:容纳,包含一组元素的对象
容器适配器:stack(栈),queue(队列),priority_queue(优先队列)
迭代器是泛化的指针,提供了顺序访问容器中每个元素的方法。
使用在STL容器以外的迭代器,要包含头文件
输入流迭代器:istream_iterator
输出流迭代器:ostream_iterator
迭代器:功能更为强大的指针,当元素类型为类或结构体,可用->访问该元素的成员
适配器:负责转换
泛型程序设计:1. 让程序尽量的通用
2. 编写不依赖于具体数据类型的程序
3.将算法从特定的数据结构中抽象出来,成为通用的
函数对象:一个行为类似函数的对象,对它可以像调用函数一样调用
函数对象是泛化的函数,任何普通的函数和任何重载了“()”运算符类的对象都可以作为函数对象使用
使用STL的函数对象,要包含头文件
使用STL的算法,要包含头文件
迭代器是算法和容器的桥梁,通过迭代器来访问容器中的元素
迭代器的辅助函数: advance(p,n) //对p执行n次自增操作
distance(first,last)//计算两个迭代器first和last的距离,即对first执行多少次“++”操作能使得first=last
随机访问:能使用下标
STL中的顺序容器:顺序性容器的元素是线性排列的,可以随时在指定位置插入和删除元素
向量(vector)
双端队列(deque)
列表(list)
单向链表(forward-list)
数组(array)
前四个在逻辑上可看做是一个长度可扩展的数组,数组容器长度固定
顺序性容器接口:(不包含单向链表(forward-list)和数组(array))
包含的通用操作:构造函数
赋值函数:assign
插入函数:insert,push_front(只对list和deque),push_back,emplace,emplace_front
删除元素:erase,clear,pop_front(只对list和deque),pop_back,emplace_back
首尾元素的直接访问:front,back
改变大小:resize
双端队列:在两端插入或删除元素快,在中间插入或删除元素慢,随机访问较快,但比向量慢
列表特点:在任意位置插入和删除元素都很快,但不支持随机访问,还有一个很有用的接合操作:即拼接操作,s1.splice(p,s2,q1,q2)//将s2中[q1,q2)移动到s1所指元素之前
单向链表(forward_list):每个结点只有指向下个结点的指针,没有简单的方法来获取一个结点的前驱未定义insert,emplace和erase操作,而定义了insert_after,emplace_after和erase_after操作,其参数与list的insert,emplace和erase相同,但并不是插入或删除迭代器p1所指的元素,而是对p1所指元素之后的结点进行操作,不支持size操作
数组(array)
array是对内置数组的封装,提供了更安全,更方便的使用数组的方式
array的对象的大小是固定的,定义时除了需要指定元素类型,还需要指定容器大小。
不能动态地改变容器大小