一、STL容器类

1.1 STL介绍

  1. 容器就是盛放东西的东西,这里被盛放的一般是数据对象,用来盛放的是容器类
  2. 容器类的内核就是:数据结构 + 算法
  3. STL(Standard Template Library,标准模板库)
  4. STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)

1.2 STL六大组建

  1. 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
  2. 算法:常用的各种算法,如sort、find、copy、for_each等
  3. 迭代器:扮演了容器与算法之间的胶合剂
  4. 仿函数:行为类似函数,可作为算法的某种策略
  5. 适配器:一种用来修饰容器或者仿函数或迭代器结构的东西。
  6. 空间配置器:负责空间的配置与管理

二、迭代器

2.1 迭代器介绍

  1. 迭代器就是能通过移动来遍历处理的一种机制。
  2. 每个容器都有自己专属的迭代器。
  3. 迭代器就是C++为我们设计的一个高层次的“指针”,高层指针是面向容器中的元素的

2.2 迭代器的细节

  1. begin和end返回可读可写的迭代器,而cbegin和cend返回const的只读迭代器
  2. begin返回第0个元素的迭代器(类似于C数组的首元素首地址指针)
  3. end指向的不是末尾元素的迭代器,而是末尾元素的(实际不存在的)下一个元素的迭代器
  4. 前闭后开区间,经常记做[begin end),这样设计是为了写循环遍历时方便

2.3 正向和逆向迭代器

  1. rbegin和rend返回逆向迭代器
  2. 逆向迭代器的begin是最末尾元素,而end是第0个元素去(实际不存在的)前面1个元素的迭代器
  3. 逆向迭代器++是向前移动,而–是向后移动

2.4 迭代器的越界

  1. 和数组越界类似,编译时不审查,运行时会崩溃
  2. 不管是正向还是逆向迭代器,++不到end,–不到begin,就不会越界

三、容器库实例 array

std容器 环_数据结构


std容器 环_迭代器_02


std容器 环_std容器 环_03

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;
}