一、STL容器类
1.1 STL介绍
- 容器就是盛放东西的东西,这里被盛放的一般是数据对象,用来盛放的是容器类
- 容器类的内核就是:数据结构 + 算法
- STL(Standard Template Library,标准模板库)
- STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
1.2 STL六大组建
- 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
- 算法:常用的各种算法,如sort、find、copy、for_each等
- 迭代器:扮演了容器与算法之间的胶合剂
- 仿函数:行为类似函数,可作为算法的某种策略
- 适配器:一种用来修饰容器或者仿函数或迭代器结构的东西。
- 空间配置器:负责空间的配置与管理
二、迭代器
2.1 迭代器介绍
- 迭代器就是能通过移动来遍历处理的一种机制。
- 每个容器都有自己专属的迭代器。
- 迭代器就是C++为我们设计的一个高层次的“指针”,高层指针是面向容器中的元素的
2.2 迭代器的细节
- begin和end返回可读可写的迭代器,而cbegin和cend返回const的只读迭代器
- begin返回第0个元素的迭代器(类似于C数组的首元素首地址指针)
- end指向的不是末尾元素的迭代器,而是末尾元素的(实际不存在的)下一个元素的迭代器
- 前闭后开区间,经常记做[begin end),这样设计是为了写循环遍历时方便
2.3 正向和逆向迭代器
- rbegin和rend返回逆向迭代器
- 逆向迭代器的begin是最末尾元素,而end是第0个元素去(实际不存在的)前面1个元素的迭代器
- 逆向迭代器++是向前移动,而–是向后移动
2.4 迭代器的越界
- 和数组越界类似,编译时不审查,运行时会崩溃
- 不管是正向还是逆向迭代器,++不到end,–不到begin,就不会越界
三、容器库实例 array
int main(void)
{
array<int, 6> data = {1,2,3,4,5,6};
//通过数组 形式的 下标进行访问容器内的数据
cout << "data.at(2) : "<< data.at(2) << endl;
//通过数组 形式的 下标进行访问容器内的数据
cout << "data[2] : "<< data[2] << endl;
//返回容器的第一个元素
cout << "data.front : "<< data.front() << endl;
//返回容器的最后一个元素
cout << "data.back : "<< data.back() << endl;
//data.data() 返回容器的首地址指针
cout << "data.front : "<< *data.data() << endl;
//检查容器是为空返回1 不为空返回0
cout << "data.empty : "<< data.empty() << endl;
//返回指向起始地址的迭代器 起始地址是容器的第0号位置
cout << "data.begin : "<< *data.begin()<< endl;
//返回指向终止地址的迭代器 终止地址是容器的最后一个位置 + 1
cout << "data.end : "<< *(data.end()-1)<< endl;
//返回容器的长度
cout << "data.size : " << data.size()<< endl;
//通过迭代器修改容器的值
*data.begin() = 222;
*data.end() = 333;
// cbegin只能做右值进行数据读取 c 代表 const 只读 不可修改
*data.cbegin();
*data.cend() ;
//遍历迭代器打印所有元素
for(auto c = data.begin(); c!=data.end();c++)
{
cout<< "data: " << *c <<endl;
}
//容器的交换方法
array<int, 3> a1 = {1,2,3};
array<int, 3> a2 = {4,5,6};
a1.swap(a2);
for (auto c = a1.begin(); c != a1.end(); c++)
{
cout << *c << endl; // 返回容器的长度
}
return 0;
}