一.初识STL
1.STL诞生
-可重复利用
-面向对象和泛型编程的目的复用性的提升
-建立数据结构和算法的一套标准,诞生了STL
2.STL基本概念
-STL(Standard Template Library,标准模板库)
-STL广义分类:容器 算法 迭代器
-容器和算法只见通过迭代器惊醒无缝连接
-STL几乎送油代码都采用了模板类或者模板函数
3.STL六大组件
STL大体分为六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器
-1.容器:各种数据结构,如vector,list,deque,set,map
-2.算法:各种常用的算法,如sort,find,copy,for_each
-3.迭代器:扮演了容器与算法之间的胶合剂
-4.仿函数:行为类似函数,可作为算法的某种策略
-5.适配器:一种用来修士容器或者仿函数或迭代器接口的东西
-6.空间配置器:负责空间的配置与管理
4.STL中的容器,算法,迭代器
-容器:置物之所也.
序列式容器:强调之的排序,序列式容器中的每个元素均有固定的位置
关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系
-算法:问题之解法也
有限的步骤,解决逻辑或数学上的问题,这门学科我们叫做算法(Algotithms)
算法分为:质变算法和非质变算法
质变算法:更改区间元素,如拷贝,提花,删除
非质变算法,不更改区间元素,如查找,计数,遍历,寻找极值
迭代器:容器和算法之间粘合剂
提供一张方法,使之依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式
每个容器都有自己专属的迭代器
迭代器使用非常类似与指针,初学阶段我们可以先理解迭代器为指针
二.初识STL
VECTOR
1.vector存放内置数据类型
-容器vector
-算法for_each
-迭代器vector<int>::itrator
创建
vector<int> v;
向容器中插入数据
v.push_back();
通过迭代器访问容器中的数据
vector<int>::iterator itBegin=v.begin();
vector<int>::iterator itEnd=v.end();
注意itEnd的位置
第一种遍历方式
while(itBegin!=itEnd)
{
cout<<*itBegin<<endl;
itBegin++;
}
第二种遍历方式
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<*it<<endl;
}
第三种
void myPrint(int val)
{
cout<<val<<endl;
}
for_each(v.begin(),v.end(),myPrint);
2.vector存放自定义数据类型
class Person{
public:
Person(string name,int age)
{
this->mName=name;
this->mAge=age;
}
public:
string mName;
int mAge;
};
vector<Person> v;
Person xx('a',1);
v.push_back(xx);
void myPrint(Person val)
{
cout<<val.mName<<endl;
cout<<val.mAge<<endl;
}
for_each(v.begin(),v.end(),myPrint);
注意:这是值传递,地址传递需要修改
3.容器嵌套容器
类似于二维数组
vector<vector<int>> v;
for(vector<vector<int>>::iterator it=v.begin();it!=v.end();it++)
{
for(vector<int>::iterator vit=(*it).begin();vit!=(*it).end();vit++ )
{
cout<<*vit;
}
}
STRING
1.本质
string在c中是一个char*
在c++中是一个类
string内封装了许多方法
find,copy,delete,replace,insert
-string会在内部管理内存分配
2.构造函数
string s1;
const char*str="hello world";
string s2(str)
string s3(s2);
string s4(10,'a');
3.赋值操作
//operator是操作数,即要修改的数
str='a';
//将一个字符串s赋给另一个str
str.assign(s);
//将s的前n位赋给str
str.assign(s,n)
4.string字符串拼接
a+=b;
将s的前n个连接在s后
a.append(s,n);
将s的pos开始的n个字符连接s后
a.append(s,pos,n);
5.string字符串查找和替换
str.find(s,pos);
在str的前n个位置里,从pos开始查找s
str.find(s,pos,n);
在str里,从pos开始查找s最后出现的位置
str.rfind(s,pos)
在str的前n个位置里,从pos开始查找s最后出现的位置
str.rfind(s,pos,n);
6.string字符串比较
str.compare()
7.string字符串存取
str[0]=1;
str.at(1)='1';
8.string字符串插入删除
str.insert(pos,s);
str.insert(pos,n,s);
str.erase(pos,n);
9.string字符串子串获取
str.substr(pos,n);
VECTOR
1.构造
-1功能:vector和数组非常相似,也成为单端数组
-2区别:数组是静态的,vector可以动态扩展
-动态扩展:并不是接续,而是寻找新地址,然后拷贝
2.赋值
str.assign(beg,end);
把(beg,end)区间的数据拷贝给自身
3.容量和大小
str.empty()
str.capacity();
str.size();
str.resize(int num);
str.resize(int num,elem);
4.插入和删除
str.push_back()
str.pop_back()
str.insert(pos,count,ele)
str.erase(pos)
str.erase(start,end)
clear();
5.数据存取
str.at();
str[];
str.font()
str.back()
6.互换容器
str.swap(vec);
7.预留空间
str.reserve(len);
DEQUE
双端数组
1.构造
deque<T> deq;
deq.deque();
2.赋值
deq= deq1;
deq.assign(beg,end);
deq.assign(n,elem);
3.大小操作
同vector
4.插入和删除
同vector
5.数据存取
6.排序操作
deq.sort(deq.begin(),deq.end());
STACK
1.基本概念
栈是一种先进后出的容器
2.常用接口
QUEUE
1.基本概念
队列先进先出
2.常用接口
LIST
1.基本概念
链表是一种物理存储单元非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表组成:链表由一系列结点组成
结点的组成:一个是存储属于元素的数据域,另一个是存储下一个结点地址的指针域
2.构造函数
list<T> lst;
list(beg,end);
list(n,elem);
list(const list &lst);
3.赋值和交换
lst.assign();
lst.swap();
4.大小操作
5.插入和删除
6.数据存取
7.反转和排序
8.排序案例
SET/multiset
1.基本概念,构造和赋值
-所有元素都会在插入时被排序
-关联式容器,底层是二叉树结构
-set不允许有重复元素
-multiset允许容器中有重复元素
set<T> st;
set(set &st);
2.大小和交换
3.插入和删除
4.查找和统计
5.set和multiset区别
6.排序规则
set容器默认排序从大到小,利用仿函数可以改变排序规则
7.自定义类排序规则
public Person
{
}
public comparePerson
{
bool operator()(const Person,const Person)
{
return p1.m_Age>p2_Age;
}
}
set<Person,comparePerson> set
for(set<Person,comparePerson>::iterator it =s.begin();it!=s.end():it++)
{
cout<<"姓名:"<<it->m_Name<<"年龄:"<<it->m_Age<<endl;
}
PAIR
1.对组的创建
MAP
1.基本概念,构造和赋值
-简介
map中所有元素都是pair
pair中第一个元素为key(键值),起索引作用,第二个元素为value(实值)
所有元素都会根据元素的键值自动排序
-本质
map属于关联式容器,底层结构是二叉树
-优点
可以快速找到value
map<T1,T2> mp;
map(const map&map);
map= ;
2.大小和交换
mp.size();
mp.empty;
mp.swap(st);
3.插入和删除
mp.insert()
mp.clear()
mp.erase(pos)
mp.erase(beg,end)
mp.erase(key)
4.查找和统计
mp.find(key);
mp.count(key);
5.排序
利用仿函数改变原来的升序为降序排序
class MyCompare
{
public:
bool operator()(int v1,int v2)
{
return v1>v2;
}
}