算法笔记——C++标准模板库

C++标准模板库

vector

使用

#include<vector>
using namespace std;

定义

vector<typename> name;

注意区分

vector<typename> Arrayname[arraySize];
vector<vector<int> > name; //注意>>之间的空格

元素访问

//通过下标访问
vector<int> vi;
vi[i];
//通过迭代器访问
vector<int>::iterator it=vi.begin();
*(it+i);
//遍历的一种方法,注:不支持it<vi.end()
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
    printf("%d ",*it);
}
//注:只有在vector和string中,才能使用vi.begin()+3这种迭代器整数的写法。

常用函数

常用函数作用时间复杂度
begin()返回首部迭代器O(1)
end()返回尾部+1迭代器O(1)
push_back(i)在尾部插入元素iO(1)
pop_back()在尾部删除元素O(1)
size()返回元素个数O(1)
clear()清空元素O(N)
insert(it,x)在任意迭代器it处插入xO(N)
erase(it)删除it处元素O(N)
erase(first,last)删除[first,last)处元素O(N)

常见用途

  • 存储数据

  • 用邻接表存储图


set

使用

#include<set>
using namespace std;

定义

set<typename> name;
set<typename> Arrayname[arraySize];

元素访问

//只能通过迭代器访问
set<int>::iterator it=st.begin();
// *(it+i); 不能这么写。只有在vector和string中,才能使用(it+i)这种迭代器整数的写法。
//遍历的一种方法,注:不支持it<vi.end()
for(vector<int>::iterator it=st.begin();it!=st.end();it++){
    printf("%d ",*it);
}
//set 自动递增排序,自动去除重复元素

常用函数

常用函数作用时间复杂度
begin()返回首部迭代器O(1)
end()返回尾部+1迭代器O(1)
insert(x)将x插入set,自动递增排序和去重O(logN)
find(value)返回set对应值为value的迭代器O(logN)
size()返回元素个数O(1)
clear()清空元素O(N)
erase(value)删除值为value元素O(logN)
erase(it)删除it迭代器处元素O(1)
erase(first,last)删除[first,last)迭代器处元素O(last-first)

常见用途

  • 自动去重并按升序排序

延申:

  • 处理不去重的:multiset
  • 只去重不排序:unordered_set(C++11)

string

使用

//注string和string.h完全不同
#include<string>
using namespace std;

定义

string str;
string str="abcd";

元素访问

//通过下标访问
string str="abcd";
str[i];
//如果读入和输出字符串则用cin和cout
cin>>str;
cout<<str;
//也可以用printf()
printf("%s\n",str.c_str());

//通过迭代器访问
string::iterator it=str.begin();
*(it+i);
//遍历的一种方法,注:不支持it<vi.end()
for(string::iterator it=str.begin();it!=str.end();it++){
    printf("%d ",*it);
}
//注:只有在vector和string中,才能使用vi.begin()+3这种迭代器整数的写法。

常用函数

常用函数作用时间复杂度
运算符 +=拼接字符串
比较运算符按字典序比较大小
insert(pos,string)在pos号位置插入字符串stringO(N)
insert(it,it2,it3)it为原字符串欲插入位置,it2,it3为待插字符串的首尾迭代器O(N)
size()/length()返回string长度O(1)
clear()清空元素O(1)
erase(pos,length)pos为需要删除的起始位置,length为删除的字符个数O(N)
erase(it)删除it迭代器处元素O(N)
erase(first,last)删除[first,last)迭代器处元素O(N)
substr(pos,len)返回从pos开始,长度为len的字串O(len)
string::npos是一个常数,find函数失配的返回值,-1或者4294967295都对
find(str2)返回其在str中第一次出现的位置或者string::nposO(str.length()*str2.length())
find(str2,pos)返回其在str中pos号开始第一次出现的位置或者string::nposO(str.length()*str2.length())
replace(pos,len,str2)把str从pos号位开始、长度为len的子串替换为str2O(str.length())
replace(it1,it2,str2)把str迭代器[it1,it2)的子串替换为str2O(str.length())

map

使用

#include<map>
using namespace std;

定义

map<typename1, typename2> name;//不能用char数组,可以改用string

元素访问

//通过下标访问,map的键唯一
map<char,int> mp;
mp['c'];
//通过迭代器访问
map<char,int>::iterator it;
//遍历的一种方法
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){
    printf("%c %d\n",it->first,it->second);
}
//map会以键从小到大的顺序自动排列

常用函数

常用函数作用时间复杂度
begin()返回首部迭代器O(1)
end()返回尾部+1迭代器O(1)
find(key)返回键为key的映射的迭代器O(logN)
size()返回元素个数O(1)
clear()清空元素O(N)
erase(key)删除键为key的元素O(logN)
erase(it)删除it处元素O(1)
erase(first,last)删除[first,last)处元素O(last-first)

常见用途

  • 建立字符或字符串与整数之间的映射
  • 判断大整数或者其他数据类型是否存在
  • 字符串与字符串的映射

延申

  • 一键多值:multimap
  • 只映射不排序:unordered_map(C++11)

queue

使用

#include<queue>
using namespace std;

定义

queue<typename> name;

元素访问

//只能通过front()访问队首和back()访问队尾
queue<int> q;
q.front();
q.back();

常用函数

常用函数作用时间复杂度
push(x)将x入队尾O(1)
front()访问队首元素O(1)
back()访问队尾元素O(1)
pop()将队首元素出队O(1)
empty()判空,返回true或 falseO(1)
size()返回元素个数O(1)

常见用途

  • 广度优先搜索

延申

  • 双端队列:deque
  • 优先队列:priority_queue

priority_queue

使用

#include<queue>
using namespace std;

定义

priority_queue<typename> name;

元素访问

//只能通过top()访问队首
priority_queue<int> q;
q.top();

常用函数

常用函数作用时间复杂度
push(x)将x入队尾O(logN)
top()访问队首元素O(1)
pop()将队首元素出队O(logN)
empty()判空,返回true或 falseO(1)
size()返回元素个数O(1)

优先级设置

//基本数据结构
//下面两个都是数字大的优先级大
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
//下面表示数字小的优先级大
priority_queue<int, vector<int>, greater<int> > q;

//结构体
//方法一,重载小于号(大于号会出现编译错误)
struct fruit{
    string name;
    int price;
    friend bool operator < (const fruit &f1, const fruit &f2){
        return f1.price<f2.price;
    }
};
priority_queue<fruit> q;
//方法二,cmp函数
struct fruit{
    string name;
    int price;
};
struct cmp{
    bool operator () (const fruit &f1, const fruit &f2){
        return f1.price<f2.price;
    }
}
priority_queue<fruit, vector<fruit>, cmp > q;
    

常见用途

  • 一些贪心问题
  • 优化Dijkstra算法

stack

使用

#include<stack>
using namespace std;

定义

stack<typename> name;

元素访问

//只能通过top()访问栈顶元素
stack<int> st;
st.top();

常用函数

常用函数作用时间复杂度
push(x)将x入栈O(1)
top()访问栈顶元素O(1)
pop()弹出栈顶元素O(1)
empty()判空,返回true或 falseO(1)
size()返回元素个数O(1)

常见用途

  • 模拟递归

pair

使用

//<map>里面自带<utility>
#include<utility>
using namespace std;

定义

pair<typename1, typename2> name;
//举例
pair<string, int> p;
pair<string, int> p("haha", 5);
//临时pair
pair<string, int>("haha", 5);
make_pair("haha",5);

元素访问

//pair中只有两个元素,分别是first和second,按照结构体的方式访问即可。
pair<string, int> p("haha", 5);
p.first;
p.second;

常用函数

常用函数作用时间复杂度
比较运算符先判断first大小,当first相等时再判断second

常见用途

  • 替代二元结构体和构造函数
  • 作为map的键值对进行插入

algorithm

使用

#include<algorithm>
using namespace std;

常用函数

常用函数作用时间复杂度
max(x,y)返回最大值,可嵌套(可以是浮点数)
min(x,y)返回最小值,可嵌套(可以是浮点数)
abs(x)返回x的绝对值(不可以是浮点数)
swap(x,y)交换x和y的值
reverse(it,it2)反转迭代器在[it,it2)的元素
next_permutation(it,it2)给出迭代器[it,it2)在全排列的下一个序列
fill(it,it2,value)迭代器在[it,it2)的元素赋值value
sort(it,it2)迭代器在[it,it2)的元素递增排序
sort(it,it2,cmp)迭代器在[it,it2)的元素按cmp函数排序
lower_bound(first,last,val)寻找[first,last)范围内第一个值大于等于val的元素的位置O(log(last-first))
upper_bound(first,last,val)寻找[first,last)范围内第一个值大于val的元素的位置O(log(last-first))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值