STL道初解

一.初识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;

}

}

猜你喜欢

转载自blog.csdn.net/weixin_61743641/article/details/132006552