目录
1 前言
2 迭代器
2.1 访问第一个元素
2.2 访问最后一个元素的下一个元素
2.3 遍历方法
2.3.1 while
2.3.2 for(最常用)
2.4 适用性
3 基本数据结构
3.1 vector(动态数组)
3.1.1 insert(插入)
3.1.2 容器嵌套容器
3.1.3 自定义类型
3.1.4 常用函数
3.2 string(字符串)
3.2.1 插入+删除
3.2.2 查找
3.2.3 字符串和数字互化
3.2.4 替换
3.2.5 常用函数
3.3 queue(队列)
3.4 list(链表)
3.5 priority_queue(优先队列)
3.5.1 常用函数
3.5.2 排序
3.6 stack(栈)
3.7 set(不能有重复元素的集合)multiset(可以有重复元素的集合)
3.7.1 插入+排序
3.7.2 常用函数
3.8 map(键不重复的键值对) multimap(键重复的键值对)
3.8.1 插入+排序
3.8.2 常用函数
1 前言
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。
C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。
STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)。
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。
算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.
迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
2 迭代器
2.1 访问第一个元素
这里以vector为例:
vector<int>::iterator it=v.begin();
2.2 访问最后一个元素的下一个元素
这里以vector为例:
vector<int>::iterator it=v.end();
2.3 遍历方法
2.3.1 while
while(it!=v.end())
{
cout<<*it<<endl;
it++;
}
2.3.2 for(最常用)
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<*it<<endl;
}
2.4 适用性
2.5 种类
3 基本数据结构
3.1 vector(动态数组)
3.1.1 insert(插入)
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.insert(v.begin(),5,9);//insert(起始地址,插入个数,插入字符)
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<*it<<endl;
}
return 0;
}
3.1.2 容器嵌套容器
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<vector<int> >v;
vector<int>v1;
vector<int>v2;
vector<int>v3;
vector<int>v4;
v1.push_back(1);
v2.push_back(2);
v3.push_back(3);
v4.push_back(4);
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
for(vector<vector<int> >::iterator it=v.begin();it!=v.end();it++)
{
for(vector<int>::iterator mit=(*it).begin();mit!=(*it).end();mit++)
{
cout<<*mit<<endl;
}
}
}
3.1.3 自定义类型
类模板:
#include <bits/stdc++.h>
using namespace std;
class person
{
public:
person()
{
this->mname=name;
this->mxuehao=xuehao;
}
public:
string mname,name;
int mxuehao,xuehao;
};
int main()
{
person p1;
cin>>p1.mname>>p1.mxuehao;
cout<<"xingming:"<<p1.mname<<"xuehao:"<<p1.mxuehao<<endl;
return 0;
}
vector自定义:
#include <bits/stdc++.h>
using namespace std;
class person
{
public:
person(string name,int age)
{
this->mname=name;
this->mage=age;
}
public:
string mname;
int mage;
};
int main()
{
vector<person>v;
person p1("aaa",10);
person p2("bbb",20);
person p3("ccc",30);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
for(vector<person>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"xingming:"<<it->mname<<"nianling:"<<it->mage<<endl;
}
}
3.1.4 常用函数
3.2 string(字符串)
3.2.1 插入+删除
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
s="abcde";
s.insert(0,"123");//insert(插入位置,插入字符)
cout<<s<<endl;
s.erase(1,3); //erase(擦除位置,擦除长度)
cout<<s;
return 0;
}
3.2.2 查找
#include <bits/stdc++.h>
using namespace std;
//注意两种查找区别
int main()
{
//字符串特殊查找
string s;
s="abcdefgbc";
cout<<s.find("bc")<<endl;//正序查找
cout<<s.rfind("bc")<<endl;//倒序查找
//其他查找
vector<int>v;
v.push_back(123456789);
if(find(v.begin(),v.end(),123456789)!=v.end())
{
cout<<"win";
}
return 0;
}
3.2.3 字符串和数字互化
详见例题超级质数:
超级质数(蓝桥杯C/C++算法赛)_菜只因C的博客-CSDN博客_超级质数https://blog.csdn.net/m0_71934846/article/details/128723978?spm=1001.2014.3001.5502
3.2.4 替换
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
s="abcde";
s.replace(1,3,"xyz");//replace(起始位置,替代长度,替代字符串)
cout<<s;
return 0;
}
3.2.5 常用函数
3.3 queue(队列)
常用函数:
3.4 list(链表)
常用函数:
3.5 priority_queue(优先队列)
3.5.1 常用函数
3.5.2 排序
注意:
排序的时候,默认是从小到大;从大到小排序要使第三个参数为greater()。
建堆的时候,默认是最大堆;最小堆要使第三个参数为greater()。
优先队列默认大根堆(大到小排序),如果想从小到大排序,那么
<int,vector<int>,greater<int> >//升序排列(小根堆)
3.6 stack(栈)
常用函数:
3.7 set(不能有重复元素的集合)multiset(可以有重复元素的集合)
3.7.1 插入+排序
注意:
排序的时候,默认是从小到大;从大到小排序要使第三个参数为greater()。
建堆的时候,默认是最大堆;最小堆要使第三个参数为greater()。
set默认从小到大排序,如果想从大到小排序,那么
<int,greater<int> >//降序排列
#include <bits/stdc++.h>
using namespace std;
int main()
{
set<int>s;//不可重复,小-》大
s.insert(1);
s.insert(1);
s.insert(3);
s.insert(2);
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
cout<<endl;
set<int,greater<int> >s1;//不可重复,大-》小
s1.insert(1);
s1.insert(1);
s1.insert(3);
s1.insert(2);
for(set<int>::iterator kit=s1.begin();kit!=s1.end();kit++)
{
cout<<*kit<<endl;
}
cout<<endl;
multiset<int>m;//可重复
m.insert(1);
m.insert(1);
m.insert(3);
m.insert(2);
for(multiset<int>::iterator mit=m.begin();mit!=m.end();mit++)
{
cout<<*mit<<endl;
}
return 0;
}
3.7.2 常用函数
3.8 map(键不重复的键值对) multimap(键重复的键值对)
3.8.1 插入+排序
默认从大到小排序
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<int,int,less<int> >m;//小-》大
m.insert(pair<int,int>(4,10));
m.insert(pair<int,int>(2,1));
m.insert(pair<int,int>(3,5));
m.insert(pair<int,int>(1,9));
for(map<int,int>::iterator it=m.begin();it!=m.end();it++)
{
cout<<it->first<<' '<<it->second<<endl;
}
return 0;
}