导论
概念
STL(Standard Template Library,标准模版库)
用于简化代码、避免重复工作所采用的库
组成
容器 各种数据结构,如vector、list、deque等,用于存放数据
算法 各种常用的算法,如sort、find、copy等
迭代器 扮演容器与算法之间的胶合剂
仿函数 行为类似函数,可作为算法的某种策略
适配器 一种修饰容器或者仿函数或迭代器接口的东西
空间配置器 负责空间的配置与管理
其中:
容器分为序列式容器(强调值的排序,各元素有固定位置)和关联式容器(各元素没有严格的顺序关系)
算法分为质变算法(运算时会更改元素内容)和非质变算法(与前者相反)
注意,需要记住遍历器的代码:
s = 库<数据类型>
库::iterator it = s.begin()
vector库
容器:vector
算法:for_each
迭代器:vector<int>::interator
ps:vector库的遍历操作
第一种:
vector<int>::iterator itBrgin = v.begin();
vecotr<int>::iterator itEnd = v.end();
while (itBegin != itEnd)
{
cout<< *itBegin << endl;
itBegin++;
}
第二种:
for(vector<int>::iterator it = v.begin();it !=v.end();it++)
{
cout<< *it << endl;
}
第三种:
#include<algorithm>
void myprint(int val)
{
cout<< val << endl;
}
for_each(v.beging,v.end,myprint);
string
一、概念
与char*不同,string是一种类
它其中已经包含了char*以及其他数据处理方法,如:find、copy等
二、构造
string()//创建一个空字符
string(const char* s)//使用字符串是初始化
string(const string& str)//使用一个string对象初始化另一个string对象
string(int n,char c) //使用n个字符c初始化
三、赋值
主要是assign函数的利用与python不同,其他则类似
str1.assign("内容")
//直接赋值
str2.assign("内容",n)
//给str2赋值内容中前n个字符
str3.assign(str2)
//转接赋值
str4.assign(10,"a")
//为str4赋值10个a
四、拼接
方法:
“+”拼接:str3 = “str1” +“str2”
.append拼接:str1.append(“str2”,n,m) //从第n位开始截取m位字符
五、查找
.find(“”)从左往右查找字符串并返回其位置 注意 .rfind(“”)查找方向相反
六、替换
.replace(n,m,"str") //将原字符串第n位到第m位替换为‘str’
七、切片
插入
.insert(n,"str")//向第n位插入“str”
删除
.erase(n,m)//删除第n至m位
访问
str[n] //与python相似
.at(n)//切出第n位
ps:可以用“=”对单个字符进行修改
如:
a = "hello";
a[1] = "q";
cout<< a <<ednl;
//输出:“hqllo”
deque
一、概念
双端数组,对于头尾数据的删除插入效率高
(当数据量变大时,vector此类操作处理效率变低)
二、构造
与vector一样,暂不赘述
三、赋值
与vector一样,暂不赘述
四、切片
push_front() & push_back//往前\后端加入
pop_front() & pop_back//删除前\后端
clear()//清空
list
一、概念
链表数组,一个元素储存了数据与位置,
对于任意位置快速插入删除元素;但是,遍历速度低、占用空间大
二、构造
与vector一样,暂不赘述
三、赋值与交换
赋值与与vector一样,暂不赘述
交换:
a.swap(b)//将a与b的数据交换
四、切片
remove(elem)//删除容器里所有与elem相同的元素
其余与deque相同
ps:a[b]与.at()在list中无法使用,只能使用.front()和.back()访问前后端
五、反转与排序
与python相似:
.reverse()//反转
.sort()//排序
set
一、概念
关联式容器,自动排序,不允许重复
与python中的元组类似
二、构造
set <int> a//创建名为a的set
set(a)//复制a的数据
三、赋值
与vector一样,暂不赘述
四、切片
注意,set库中无front与back的插入删除,只能利用insert、clear、erase进行切片
五、查找和统计
查找:
find(elem)//如果输出为.end()的值,则该值不存在
统计:
count(elem)
pair
一、概念
成对出现的数据
二、构造
语法:
pair<a的数据类型,b的数据类型> 组名称 (a,b)
pair<a的数据类型,b的数据类型> 组名称 = make_pair(a,b)
三、切片
pair.first()//返回前者
pair.second//返回后者
map
一、概念
与python中的字典相似,但其按照键的值升值排序
且键值不能重复
二、构造
与set相似
三、赋值
利用pair进行赋值
pair<int,int>a(1,100)
map<int,int>b
b = a
四、切片
与set相似,不能用front与back进行访问
插入:
m.insert(pair<int,int>(1,10)
m.insert(make_pair(2,20))
m[4] = 40 //不建议,当键插错时,库会自动创建一个值为0的键值对
其余切片与set类似
五、查找与统计
与set一样,暂不赘述
六、排序
其默认升序
若降序,可创建仿函数:
class my_compare
{
public:
bool operator()(int v1,int v2)
{
return v1 > v2
}
};