初识STL:
|| 什么是STL:Standard Template Library 标准模板库 ,目的就是为了提升复用性
|| STL广义上三大类分为容器,算法,迭代器。关系:容器和算法间通过迭代器进行无缝连接
|| STL细分为六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器
容器:各种数据结构,用以存放数据vector, list, deque, set, map
算法:各种常用的算法,sort,find,copy, for_each
迭代器:算法通过迭代器访问容器中的数,每个容器都有自己专属的迭代器
仿函数:行为类似函数,可作为算法的协助
适配器:一种用来修饰容器/ 仿函数/ 迭代器接口的东西
空间配置器:负责空间的配置和管理
|| 容器:可分为序列式容器和关联式容器
序列式容器:强调值的序列
关联式容器:强调值的关系(树)
|| 算法:分为质变算法和非质变算法
质变算法:改变原区间的元素,拷贝/替换/删除
非质变算法:改变原区间的元素,查找,计数遍历
|| 迭代器:分为输入输出迭代器(只读只写 ±1),前向双向迭代器(读写 ±1),随机访问迭代器(读写 ±x)
vector相关 (数组) :
|| 创建语法:
#include<xvector>
//创建一个vector容器
vector<int> arr;
|| 容器的数据处理方式:push_back(), pop_back()
|| 遍历法一:使用迭代器iterator
//迭代器的个人理解(一家之言):可看作是一个指向容器元素的指针(专门用来做迭代)
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
|| 遍历法二:使用算法Algorithm库
for_each(头指针, 尾指针, 传入函数的函数名)
for_eac底层代码: 给函数传入的参数其实是指针的解引用!即容器元素本身
inline _Fn for_each(_InIt _First, _InIt _Last, _Fn _Func) { // perform function for each element
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
for (; _UFirst != _ULast; ++_UFirst) {
_Func(*_UFirst);
}
return _Func;
}
void myPrint(int val) {cout << val << " ";}
for_each(v.begin(),v.end(), myPrint);
二维数组:
创建语法
vector<voctor<int>> bArr;
vector<int> sArr1;
vector<int> sArr2;
vector<int> sArr3;
for(int i = 0; i < 4; i++)
{
sArr1.push_back(i);
sArr2.push_back(i);
sArr3.push_back(i);
}
bArr.push_back(sArr1);
bArr.push_back(sArr2);
bArr.push_back(sArr3);
遍历法一:使用迭代器iterator
for (vector<vector<int>>::iterator it = bArr.begin(); it != bArr.end(); it++)
{
cout << endl;
//现在 *it 就是子数组本身
for (vector<int>::iterator sit = (*it).begin(); sit != (*it).end(); sit++)
cout << *sit << " ";
}
遍历法二:使用算法Algorithm库
void myPrint(vector<int> val) { //val == 小容器
for (vector<int>::iterator sit = val.begin(); sit != val.end(); sit++)
cout << *sit << " ";
}
for_each(bArr.begin(), bArr.end(), myPrint);