C++ STL 学习记录
记录在LeetCode刷题过程中使用C++ STL库的要点。
文章目录
一、map 相关
排序
基于key 排序
1、map需要在创建时,指定排序方法,若key为自定义类型,需要重载比较运算符
2、map无法使用sort函数
eg:
struct comLen{
bool operator(const string &lhs, const string &rhs)
{return lhs.length()<rhs.length();}
}
map<string,int,comLen> LenLessMap;
基于value排序
迂回战术:map无法使用sort()接口,也就无法重载运算符,指定使用value进行比较。因此,将map转化成vector类型,进行排序。
tips:线性的(如vector,list,deque)容器才能使用sort,关联容器不行
代码eg:
map<string,int> m;
元素插入过程
vector<pair<string,int> > vec(m.begin(),m.end());
sort(vec.begin(),vec.end(),combyValue);
二、string 相关
分隔字符串
1、通过stringstream实现,注意stingstream的使用需要包含sstream头文件,且只能以char类型作为分隔符;
vector<string> split3(const string &str, const char pattern)
{
vector<string> res;
stringstream input(str); //读取str到字符串流中
string temp;
//使用getline函数从字符串流中读取,遇到分隔符时停止,和从cin中读取类似
//注意,getline默认是可以读取空格的
while(getline(input, temp, pattern))
{
res.push_back(temp);
}
return res;
}
字符串功能
1、substr(i, j) 返回index从i开始的长度为j的子串;
substr(i)返回从i 到尾部的子串;
2、append(i, ‘a’) 字符串末尾添加i 个’a’
3、数值转换
int val = 100;
string str = to_string(val); //s = "100", 将val转为string
int val2 = stoi(str, 0, 10); //val2 = 100, 将str从0开始的位置转为10进制int
// 类似的还有stof, stod...
4、判断大小写
string s = "abCdE";
islower(s[1]); //isupper() 判断小写
isupper(s[1]); // 判断大写
s[3] = toupper(s[1]); //转换为大写
tolower(s[1]); // 转换为小写
isalpha(int c); //判断是不是字母
自定义比较函数方法
有三种方式:
1、重载运算符,如此则该对象与身俱来获得比较能力(sort),重载运算符的操作不能用于pair类型数据的排序,只能作用于结构体或类对象。
struct Node
{
int index;
int value;
/* 注意点:这里的 const 不可少编译约束 */
bool operator < (const Node& compNode) const
{
return this->value < compNode.value;
}
};
// 或者
struct Edge
{
int from,to weight;
friend bool operator<(Edge a,Edge b)
{
return a.weight>b.weight;
}
};
2、自定义比较函数,适用于sort函数(包括pair类型数据排序),cmp函数如果放在solution类中,应申明为static。
bool cmp(const node& a, const node& b){
return a.x > b.x //对x降序排列
}
3、自定义比较仿函数,适用sort函数(包括pair),定义set,map,优先队列等类型。
/* 针对某种类型的自定义比较仿函数,cpp 中 struct 相当于全部 public 的 class */
struct classcomp
{
/* const 这里编译没有约束,但是对于明确的不可变参加上更严谨 */
bool operator() (const Node& a, const Node& b) const
{
return a.value > b.value;
}
};
// classcomp 必须是针对 Node 类型的比较仿函数,第二个缺省存储结构也不能少,一般用vector就可以
// 头文件#include<queue>
priority_queue<Node, vector<Node>, classcomp> priQue;
STL也有一些内置的仿函数,例如less,greater等。
仿函数可以通过初始化然后像普通函数一样使用。最简单的就是在仿函数后面加上()。
// great<int>() 是降序,记住带括号
sort(data.begin(), data.end(), greater<int>());
二、数组相关
二维数组初始化
vector<vector <int> > ivec(m ,vector<int>(n,0));
int stepNum[obstacleGrid.size()][obstacleGrid[0].size()];
memset(stepNum, 0, sizeof(stepNum));
三、优先队列
1、定义
// 所需头文件
#include<queue>
// 基础类型声明,
priority_queue<int> //默认降序队列,大顶堆
priority_queue<int,vector<int>,less<int>> //大顶堆
priority_queue<int,vector<int>,greater<int>> //小顶堆
// 自定义类型优先队列声明,牢记有3个参数, 第二个参数也可以是deque、list等线性结构
priority_queue<pair<int, int>, vector<pair<int, int>>, cmpclass> range_part;
2、自定义仿函数
class cmpclass {
// 优先队列需要定义自定义比较仿函数(类), 且operator需public
public:
bool operator() (pair<int, int>& a, pair<int, int>& b)
{
// 升序排列,优先队列的top是最小值
return a.second < b.second;
}
};
3、操作
pop操作是对top的。
其他
数学
1、 取绝对值, abs(num)。