C++ STL库的学习

导论

概念

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
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laxinton

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值