C++的STL

开始

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说。

用STL我们就不用反复实现一些代码,提高开发效率。当然这个需要数据结构基础


vector动态数组

头文件

#include <vector>

初始化

vector<int> ans;//int的型的数组
vector<structure> ans;//一个structure结构体的数组
//指定长度的初始化
vector<short> ans(n);
vector<double> ans(n,2);//长度为n,全为2的数组
vector<double> shaow(ans);//拷贝初始化,类型长度需相同
vector<int> a{1, 2, 3, 4, 5};

//二维
vector<int>ans[5];//行为固定的5,列为动态可变
vector<vectot<int> >num;//行列均可以变
vector<vector<int> > a(n + 1, vector<int>(m + 1, 0));//固定n+1行m+1列初始值为0的二维数组

访问遍历

#include <iostream>
#include "vector"
using namespace std;
int main() {
    int n = 5;
    vector<int> num(5, 1);
    cout<<num[2];//访问下标为2的元素
//智能指针遍历
    for (auto i: num)
        cout << i << " ";
//遍历
    for(int i=0;i<num.size();i++)
        cout<<num[i]<<' ';
    return 0;
}

方法函数

函数含义
a.empty()判断是否为空,空为真
a.begin()返回首元素的迭代器
a.end()返回末位元素的迭代器
a.size()返回数据个数
a.insert(it,x)先任意迭代器插入一个元素
a.push_back()尾部添加一个
a.pop_back()删除最后一个元素
a.front()返回第一个数据
a.clear()清除元素
a.resize(n,v)改变数组大小为n,赋值为v
a.erase(f,l)删除[f,i)的所有元素
sort(a.begin(),a.end())排序

代码

#include <iostream>
#include "vector"
using namespace std;
int main() {
    int n = 5;
    vector<int> num(5, 1);
    for(vector<int>::iterator it=num.begin();it!=num.end();it++)
        cout<<*it<<' ';
    return 0;
}

stack栈

头文件

#include <stack>

初始化

stack<int>ans;

方法函数

函数含义
push()压栈
pop()出栈
empty()空为真
top()取得栈顶元素
size()元素个数

代码

#include <iostream>
#include <stack>
using namespace std;
int main() {
    stack<int>a;
    int i;
    while(!a.empty())
    {
        i=a.top();
        cout<<i<<" ";
        a.pop();
    }
    return 0;
}

queue队列

头文件

#include<queue>

初始化

queue<int>ans;

方法函数

函数含义
front()返回队首
back()返回队尾元素
pop()出队
push()进队
size()元素个数
empty()空队为空

代码

#include <iostream>
#include <queue>
using namespace std;
int main() {
    queue<int>a;
    for(int i=0;i<10;i++)
        a.push(i);
    int i;
    while(!a.empty())
    {
        i=a.front();
        cout<<i<<' ';
        a.pop();
    }
    return 0;
}

deque双队列

头文件

#include <deque>

初始化

deque<int>ans;

方法函数

函数含义
push_back()
push_front()
入队
back()
front()
访问
pop_back()
pop_back()
出队
erase(iterator f,iterator l)删除
empty()空为真
size()元素数量
clear()清空
sort(iterator f,iterator l)排序

代码

#include <iostream>
#include <deque>
#include "algorithm"
using namespace std;
int main() {
deque<int>a;
int b[5]={3,8,9,6,2};
for(int i=0;i<5;i++)
    a.push_front(b[i]);
sort(a.begin(),a.end());
int i;
while(!a.empty())
{
    i=a.back();
    cout<<i<<' ';
    a.pop_back();
}
    return 0;
}

priority_queue优先队列

头文件

#include<queue>

头文件

#include <map>
priority_queue<Type, Container, Functional>

方法函数

函数含义
top()队首元素
push()入队
pop()出队
empty()空为真
size()元素个数

代码

#include<iostream>
#include <queue>
using namespace std;
int main()
{
    priority_queue<int> a;
    priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆
    for (int i = 0; i < 5; i++)
    {
        a.push(i);
        c.push(i);
    }
    while (!a.empty())
    {
        cout << a.top() << ' ';
        a.pop();
    }
    cout << endl;
    while (!c.empty())
    {
        cout << c.top() << ' ';
        c.pop();
    }
    cout << endl;
    return 0;
}

map映射

头文件

#include<map>

初始化

map<string,int>a;

函数方法

函数含义
find(key)返回键为key的映射的迭代器
当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回mp.end()
erase(it)删除迭代器对应的键和值
erase(key)根据映射的键删除键和值
erase(first,last)删除左闭右开区间迭代器对应的键和值
size()返回对数
clear()清空所有元素
insert()插入元素
empty()是否为空
begin()第一个元素的迭代器
end()返回尾部的迭代器(最后一个元素的下一个地址)
rbegin()返回最后一个元素的迭代器(地址)
rend()返回第一个元素的迭代器
rend()返回第一个元素的迭代器
count(key)查看元素是否存在
lower_bound()返回指向键值>= key的第一个元素
upper_bound()返回指向键值> key的第一个元素的迭代器,

代码

#include<iostream>
#include <map>
using namespace std;
int main()
{
map<int,string>a;
a[1]="hello";
a[2]="hi";
cout<<a[1];
cout<<endl;
    map<int,string>::iterator it;
    for(it=a.begin();it!=a.end();it++)
        cout<<it->first<<':'<<it->second<<endl;
    for(auto i:a)
        cout<<i.first<<":"<<i.second<<endl;
    return 0;
}

set集合

集合不重合且有序

头文件

#include <set>

方法函数

函数含义
begin()返回第一个元素的迭代器
end()返回最后一个元素的迭代器
rbegin()返回逆序迭代器
rend()返回逆序迭代器
clear()删除set容器中的所有的元素
empty()判断是否为空
insert()插入一个元素
size()容器中的元素个数
erase(iterator)
erase(first,second)
删除指向的值
erase(key_value)删除键值key_value的值
find(元素)查找set中的某一元素,返回迭代器
lower_bound(k)返回大于等于k的第一个元素的迭代器
upper_bound(k)返回大于k的第一个元素的迭代器

代码

#include<iostream>
#include <set>
using namespace std;
int main()
{
    set<int>a;
    a.insert(8);
    a.insert(3);
    a.insert(9);
    a.insert(7);
    a.insert(6);
    a.insert(5);
    for(set<int>::iterator it=a.begin();it!=a.end();it++)
        cout<<*it<<" ";

   return 0;
}
//结果为3 5 6 7 8 9

pair对组

pair只含有两个元素,可以看作是只有两个元素的结构体.

头文件

#include<utility>

字符串

头文件

#include <string>

初始化

string str1; //生成空字符串
string str2("123456789"); //生成"1234456789"的复制品 
string str3("12345", 0, 3);//结果为"123" ,从0位置开始,长度为3
string str4("123456", 5); //结果为"12345" ,长度为5
string str5(5, '2'); //结果为"22222" ,构造5个字符'2'连接而成的字符串
string str6(str2, 2); //结果为"3456789",截取第三个元素(2对应第三位)到最后

函数方法

函数含义
sort(s.begin(),s.end());排序
size()
length()
长度
max_size()返回string对象最多包含的字符数
capacity()重新分配内存之前,string对象能包含的最大字符数
push_back()末尾插入
insert(pos,element)插入
append(str)末尾添加字符串
erase(it)erase(iterator p)删除指定字符
erase(iterator first, iterator last)删除字符串中迭代器区间所有字符
clear()清空
replace(pos,n,str)把当前字符串从索引pos开始的n个字符替换为str
replace(pos,n,x,c)把当前字符串从索引pos开始的n个字符替换为x个字符c
replace(it1,it2,str)把当前字符串[it1,it2)区间替换为str
tolower()转换为小写
toupper()转换为大写
substr(pos,n)截取从pos索引开始的n个字符
find (str, pos)

find (c, pos)
在当前字符串的pos索引位置(默认为0)开始,查找子串str,返回找到的位置索引,-1表示查找不到子串
rfind (str, pos)在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引
find_first_of (str, pos)在当前字符串的pos索引位置(默认为0)开始,查找子串s的字符
.find_first_not_of (str,pos)在当前字符串的pos索引位置(默认为0)开始,查找第一个不位于子串s的字符
find_last_of(str, pos)当前字符串的pos索引位置开始,查找最后一个位于子串s的字符
find_last_not_of ( str, pos)在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符

bitsei位组

头文件

#include <bitset>

初始化

bitset < n >a; //a有n位,每位都为0
bitset < n >a(b);
bitset < n >a(s,pos,n);//a是s中从位置pos开始的n个位的副本
bitset < n >a(s);

函数方法

函数含义
any()是否存在置为1的二进制位,有返回true
none()b中是否没有1
count()1的个数
size()二进制位的个数
test(pos)在pos位置是否为1,是返回true
b.set()所有位都置为1
reset()所有位都置为0
reset(pos)pos位置置为0
flip()所有二进制位取反
flip(pos)pos位置取反
to_ulong()同样的二进制位返回一个unsigned long值

bitset也支持位运算


array数组

头文件

#include <array>

初始化

array<int, 100> a;//声明一个大小为100的int型数组
array<int, 100> a{};//声明一个大小为100的int型数组,初始值均为0
array<int, 100> a{1, 2, 3};//始化部分值,其余全部为0
array<int, 100> a = {1, 2, 3};

访问遍历


array<int, 4> a = {1, 2, 3, 4};
for(int i = 0; i < 4; i++) 
    cout << a[i] << " \n"[i == 3];
//迭代器
for(auto i : a)
    cout << i << " ";
//at访问
array<int, 4> a = {1, 2, 3, 4};
int res = a.at(1) + a.at(2);
cout << res << "\n";

get<1>(a) = x;//将a数组下标为1位置处的值改为x

方法函数

函数含义
begin()第一个元素的访问迭代器
end()返回容器最后一个元素之后一个位置的访问迭代器
rbegin()返回最后一个元素的访问迭代器
rend()返回第一个元素之前一个位置的访问迭代器
size()返回容器中元素的数量
max_size()返回容器可容纳元素的最大数量
empty()判断容器是否为空
at(n)返回容器中 n 位置处元素的引用
front()返回容器中第一个元素的直接引用
back()返回容器中最后一个元素的直接引用
data()返回一个指向容器首个元素的指针
fill(x)将 x 这个值赋值给容器中的每个元素,相当于初始化
array1.swap(array2)交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型
sort()排序

tuple元组

头文件

#include <tuple>

初始化

tuple<int, int, string> t1;//声明一个空的tuple三元组
t1 = make_tuple(1, 1, "hahaha");

tuple<int, int, int, int> t2(1, 2, 3, 4);

auto p = make_pair("wang", 1);
tuple<string, int> t3 {p}; //将pair对象赋给tuple对象

操作

读取修改
int first = get<0>(t);
get<0>(t) = 1;
获取元素个数
tuple<int, int, int> t(1, 2, 3);
cout << tuple_size<decltype(t)>::value << "\n"; // 3
解包
int one, three;
string two; 
tuple<int, string, int> t(1, "hahaha", 3);
tie(one, two, three) = t;
cout << one << two << three << "\n"; // 1hahaha3

首先发表于个人博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值