C++ STL学习笔记

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)。

总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值