一、STL----standard template library 标准模板库
STL中的六大组件:容器 迭代器 算法 仿函数 迭代适配器 空间适配器
在C++标准中,STL被组织为下面的17个头文件:<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility>。
STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。
二、工作任务:学习<set>集合、<map>映射、<vector>向量等常用容器的算法
三、 基础
在开发过程中 程序中存在对时间要求很高的部分是,数据结构的选择很重要。
【容器】由<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>
> 序列式容器:(与值无关,插入时机地点)每个元素都有固定位置,取决于插入时机和地点,与元素值无关
1、Vector向量(数组、随机):将元素置于一个动态数组中,可以随机存取元素(用索引),在头部/尾部添加/移除元素很快。头部/中部安插元素费时;
2、list链表(按顺序):双向链表,只能按顺序走到需存取的元素,在任何位置添加/移除动作都很迅速,内部只需要调整一下指针。
> 关联式容器:(值特定排序)元素位置取决于特定的排列顺序,与插入顺序无关
1、set集合:内部依据值自动排序,且相同数值元素只能出现一次,内部由二叉树实现;
2、map映射:(根据值排序)map的元素的成对的键值/实值,内部元素依据其值自动排序,且相同数值元素只能出现一次,内部由二叉树实现。
vector<int>::iterator iter:定义了iter变量,数据类型是由vector<int>定义的iterator类型。
每个STL容器类型都定义了一个名为iteration的成员,与迭代器实际类型含义相同。
不同容器定义了自己的iterator类型,用于访问容器内的元素。
每个容器都定义了一对命名的begin和end函数用于返回迭代器。
//1.定义和初始化
vector<int> vec1; //默认初始化,vec1为空
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector<int> vec4(10); //10个值为的元素
vector<int> vec5(10,4); //10个值为的元素
//2.常用操作方法
vec1.push_back(100); //添加元素
int size = vec1.size(); //元素个数
bool isEmpty = vec1.empty(); //判断是否为空
cout<<vec1[0]<<endl; //取得第一个元素
vec1.insert(vec1.end(),5,3); //从vec1.back位置插入个值为的元素
vec1.pop_back(); //删除末尾元素
vec1.erase(vec1.begin(),vec1.end()); //删除之间的元素,其他元素前移
cout<<(vec1==vec2)?true:false; //判断是否相等==、!=、>=、<=...
vector<int>::iterator iter = vec1.begin(); //获取迭代器首地址
vec1.clear(); //清空元素
//3.遍历
//下标法
int length = vec1.size();
for(int i=0;i<length;i++)
{
cout<<vec1[i];
}
cout<<endl<<endl;
//迭代器法
vector<int>::const_iterator iterator = vec1.begin();
for(;iterator != vec1.end();iterator++)
{
cout<<*iterator;
}
【迭代器】起到粘合剂的作用 使得迭代器与算法间不干扰。可以在不知道对象内部的情况下,按一定顺序(iterator提供的方法)访问聚合对象中的各个元素。
STL中:算法 ——迭代器(连接作用)—— 容器
【算法】
由<algorithm>,<numeric>和<functional>组成
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(3); //数组尾部插入3
v.push_back(2);
v.push_back(1);
v.push_back(0);
cout << " 下标 " << v[3] << endl;
cout << " 迭代器 " << endl;
for(vector<int>::iterator i = v.begin();i!= v.end();++i) //遍历
{
cout << *i << " ";
}
cout << endl;
//在第一个元素之前插入111 insert begin+n是在第n个元素之前插入
v.insert(v.begin(),111);
//在最后一个元素之后插入222 insert end + n 是在n个元素之后插入
v.insert(v.end(),222);
for(vector<int>::iterator i = v.begin();i!= v.end();++i)
{
cout << *i << " ";
}
cout << endl;
vector<int> arr(10);
for(int i = 0; i < 10; i++)
{
arr[i] = i;
}
for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
{
cout << *i << " ";
}
cout << endl;
//删除 同insert
arr.erase(arr.begin());
for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
{
cout << *i << " " ;
}
cout << endl ;
arr.erase(arr.begin(),arr.begin()+5);
for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
{
cout << *i << " " ;
}
cout << endl ;
return 0 ;
}
三、count利用操作符 把标志范围内的元素与输入值比较 返回相等