【C++】10.STL

Standard Template Library,标准模板库
STL从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。
STL几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。

1.三大组件

1.容器

根据数据在容器中的排列特性,这些数据分为序列式容器关联式容器两种。

  1. 序列式容器强调值的排序,包含Vector容器、Deque容器、List容器等。
  2. 关联式容器是非线性的树结构,在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,包含Set/multiset容器 Map/multimap容器

2.算法

STL收录的算法包括常用的排序,查找等等,分为质变算法非质变算法

  1. 质变算法:会更改区间内的元素的内容。例如拷贝,替换,删除等等
  2. 非质变算法:不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

3.迭代器

依序寻访某个容器所含的各个元素,包含输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机访问迭代器.

2.容器

1.操作流程

  1. 引入头文件:#include <vector>
  2. 声明容器
//声明一个容器,在这个容器中存放int类型数据,容器的名称为v  
vector<int> v;
  1. 想容器中加入数据
//向容器中加入数据  
v.push_back(10);  
v.push_back(20);  
v.push_back(30);  
  1. 利用迭代器遍历容器中的数据,每个容器有专属的迭代器
vector<int>::iterator itBegin =v.begin(); 
vector<int>::iterator itEnd =v.end();  
while(itBegin!=itEnd){  
    cout<<*itBegin<<endl;  
    itBegin++;  
}

2.容器嵌套容器

重点在于vector< int >::iterator it2= (* it1).begin();

for(vector<vector<int>>::iterator it1=v.begin();it1!=v.end();it1++){  
    for ( vector<int>::iterator it2= (*it1).begin(); it2!=(*it1).end()  ; it2++) {  
        cout<<*it2<<endl;  
    }}

4. 容器迭代器

  1. v.capacity() :容器的容量,会给出一些多余的空间
  2. vector迭代器所需要的操作行为有operaroe*, operator->, operator++, operator–, operator+, operator-, operator+=, operator-=等.
  3. Vector支持随机存取,提供的是随机访问迭代器(Random Access Iterators).

5.基本方法

(1)大小操作

size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

(2)存取操作

front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素

(3)插入和删除

insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素

6.对vector内存空间的操作

(1)利用swap收缩内存空间

v.resize(10);               //size更改为10
vector<int>(v).swap(v);     //capacity更改为10

(2)利用reserve预留空间

v.reserve(100000);

3.算法

  1. 引入头文件:#include <algorithm>

4.迭代器

1.容器的迭代器

1.示例

  1. 引入头文件:#include <iterator>
  2. 普通指针也是一种迭代器!
int array[5]={ 1, 3, 5, 7, 9 };  
int *p=array;//指针指向数组的首地址 &array(0)
for(int i=0;i<5;i++){  
    cout<<*(p++)<<endl;  //*(p++):迭代输出
}
  1. 声明迭代器
//vector<int>这种容器的作用域下的迭代器,名称为it
vector<int>::iterator itBegin =v.begin();    //指向v容器中的起始位置
vector<int>::iterator itEnd =v.end();        //指向v容器中的最后一个位置的下一个地址
  1. 遍历方式
    (1)while循环
while(itBegin!=itEnd){  
    cout<<*itBegin<<endl;  //用指针得到对象
    itBegin++;  
}

(2)for循环,可以一行代码搞定

for(vector<int>::iterator it=v.begin();it!=v.end();i++){
	cout<<*it<<endl;
}

(3)利用foreach算法
① 定义打印方法

void myPrint(int v){  
    cout<<v<<endl;  
}

for_each(v.begin(),v.end(),myPrint);

2.运算符操作

3.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值