STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构
STL由一些可适应不同需求的集合类(collection class),以及在这些数据集合上操作的算法(algorithm)构成
STL内的所有组件都由模板(template)构成,其元素可以是任意类型
STL是所有C++编译器和所有操作系统平台都支持的一种库
STL组件
容器(Container)- 管理某类对象的集合
迭代器(Iterator)- 在对象集合上进行遍历
算法(Algorithm)- 处理集合内的元素
容器适配器(containeradaptor)
函数对象(functor)
STL容器类别
序列式容器-排列次序取决于插入时机和位置
关联式容器-排列顺序取决于特定准则
STL容器的共同能力
所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针。
所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素
STL容器元素的条件
必须能够通过拷贝构造函数进行复制
必须可以通过赋值运算符完成赋值操作
必须可以通过析构函数完称销毁动作
序列式容器元素的默认构造函数必须可用
某些动作必须定义operator==,例如搜寻操作
关联式容器必须定义出排序准则,默认情况是重载operator <
STL容器的共同操作
与大小相关的操作(size operator)
size()-返回当前容器的元素数量
empty()-判断容器是否为空
max_size()-返回容器能容纳的最大元素数量
比较(comparison)
==,!=,<,<=,>,>=
比较操作两端的容器必须属于同一类型
如果两个容器内的所有元素按序相等,那么这两个容器相等
采用字典式顺序判断某个容器是否小于另一个容器
STL容器的共同操作
赋值(assignment)和交换(swap)
swap用于提高赋值操作效率
与迭代器(iterator)相关的操作
begin()-返回一个迭代器,指向第一个元素
end()-返回一个迭代器,指向最后一个元素之后
rbegin()-返回一个逆向迭代器,指向逆向遍历的第一个元素
rend()-返回一个逆向迭代器,指向逆向遍历的最后一个元素之后
容器的共同操作
元素操作
insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置
erase(beg,end)-移除[beg,end]区间内的所有元素
clear()-移除所有元素
迭代器(iterator)(示例:iterator)
可遍历STL容器内全部或部分元素的对象
指出容器中的一个特定位置
迭代器(iterator)
所有容器都提供两种迭代器
container::iterator以“读/写”模式遍历元素
container::const_iterator以“只读”模式遍历元素
迭代器(iterator)
迭代器分类
双向迭代器
可以双向行进,以递增运算前进或以递减运算后退、可以用==和!=比较。
list、set和map提供双向迭代器
随机存取迭代器
除了具备双向迭代器的所有属性,还具备随机访问能力。
可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用<和>之类的关系运算符比较两个迭代器。
vector、deque和string提供随机存取迭代器
vector
vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include<vector>
vector支持随机存取
vector的大小(size)和容量(capacity)
size返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。
map/multimap
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include<map>
根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
不能直接改变元素的key,可以通过operator []直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<64> bs;
bs = 1;
cout << bs << endl;bs ^= 63;
cout << bs << endl;
bs >>= 1;
cout << bs << endl;
cout << ~bs << endl;
cout << "1 Bits: " << bs.count() << endl;
cout << bs[32] << endl;
bs.set(32);
cout << bs[32] << endl;
bs.flip(32);
cout << bs[32] << endl;
string t = bs.to_string();
unsigned long t1 = bs.to_ulong();
cout << t << endl << t1 << endl;
bs.reset();
cout << bs << endl;
cout << "Size: " << bs.size() << endl;
cout << bs.any() << endl;
cout << bs.none() << endl;
cout << "input 0-1 string: " << endl;
cin >> bs;
cout << bs << endl;
return 0;
}