leecode C++常用语法

基本数据运算:

累加:

long long total = accumulate(nums.begin(), nums.end(), 0LL);

向上取整:

将a/b向上取整代码实现

(a + b - 1) / b;

找几个数的最值:

最大值:

max({1,2,3});

最小值:

min({1,2,3});

注意:上述两个函数可以用于int类型,不能用于long long 类型,其他类型还未遇到,遇到了再总结。


multiset有序容器使用:

multiset强大的地方:自动排序,访问复杂度低(logn),以及支持重复元素。(用法参考leecode题目:1438.绝对差不超过限制的最长连续子数组

multiset<int> s;		//定义一个int类型的multiset--s
set.begin();			//返回multiset的开始指针
set.rbegin();			//返回multiset的逆向开始指针
*set;					//访问当前multiset所指向元素的值
set.insert(val);		//向当前multiset容器set中插入元素val

从multiset删除元素使用erase方法,要注意的是,如果删除值全部为val的元素
则只需将val(可以是变量,也可以是符号常量)直接传给erase即可。如果指向删除一个
值为val的元素,则需传入这个元素的迭代器如:set.erase(set.find(val));
参考下面的删除操作:

set.erase(set.find(val));	//从当前multiset容器set中删除值位val的元素(只删除一个)
set.erase(val);	//从当前multiset容器set中删除值位val的元素(只删除一个)

无序容器:

std::unordered_set<data_type> name;			//定义data_type数据类型的unordered_set容器
name.insert(key);							//将key放入name容器中
name.erase(key);							//将所有的key从容器中删除
name.erase(name.find(key));					//从容器中删除一个值为key的元素
name.size();								//返回当前容器中元素种类的个数
name.count(key);							//判计算key在容器中出现的次数
//下面来一个秀一点的操作:
int m = unordered_set<int>(nums.begin(), nums.end()).size();
//以上操作只用了一行就统计出了数组nums中的元素种类数

pair变量的使用:

pair变量存储了一个键值对。它的一个应用就是记录排序后的数组变量和索引的位置关系。这在解决一些特定的问题有奇效(例如leecode第962题:最大宽度坡)

pair<type1, type2> pir;						//定义一个pair变量
vector<pair<type1, type2>> data(n);			//定义一个pair数组
pir.first;									//访问pair变量的key
pir.second;									//索访问pair变量的val

//下面来一个和auto关键字配合使用的比较秀的访问key和val的方式
auto [_, a] =  pir							//将pir的val赋值给a,a的类型与val的类型保持一致
auto [b, _] =  pir							//将pir的key赋值给b,b的类型与key的类型保持一致

//基于上述访问方式,对于元素都是pair类型的迭代器,如unordered_map,pair类
//型数组等,都可以通过下述方式来迭代

for (auto [_, value]: 元素是pair类型的迭代器){
	value此时是迭代器元素里面的每一个值
}

for (auto [key, _]: 元素是pair类型的迭代器){
	key此时是迭代器元素里面的每一个键
}       

无序哈希表:

unordered_map<int, int> hash;		//定义哈希表
cnt.erase(key);						//从哈希表中删除某个键值对
hash.size();						//返回哈希表中有多少对键值对
hash.count(key);                    //判断key是否在哈希表中
hash.contains(val);					//判断val是否在哈希表中

//hash的每一个元素本质山是pair类型的变量,因此可用for循环迭代unordered_map的key,或者value
for (auto [_, value]: hash){
	value此时是hash里面的每一个值
}

for (auto [key, _]: hash){
	key此时是hash里面的每一个键
}

有序哈希表

有序哈希表会按照val值对键值对排序,上述无序哈希表的所有操作它都支持,并且我们用到有序哈希表通常最关心它的val最大和最小的元素,可通过以下示例来所引到

map<int, int> hash;
hash.rbegin()->first     //索引最后一个元素(val最大的元素)
hash.rbegin()->second    //索引第一个元素(val最小的元素)

栈:

stack<int> q;	//C++内置栈数据类型
int x;
q.push(x);		//将x压入栈顶
q.top();		//返回栈顶的元素
q.pop();		//删除栈顶的元素
q.size();		//返回栈中元素的个数
q.empty();		//检查栈是否为空,若为空返回true,否则返回false

栈:

vector<int> stk;    //定义vector模板类来模拟栈
stk.push_back(x);	//将x入栈
stk.top();         	//返回栈顶元素
stk.pop_back();     //删除栈顶元素使用之前一定要保证栈非空,否则报错
stk.size();         //返回栈中元素个数
stk.empty();        //检查栈是否为空,若为空返回true,否则返回false

vector:

//初始化
vector<int> vec;		//初始化一个int类型的vector数组,数组为空
vector<int> vec(len);	//初始化一个int类型的vector数组,数组有len个元素,并且这些元素都初始化为0
vector<int> vec(len, val);///初始化一个int类型的vector数组,数组有len个元素,并且这些元素都初始化为val
vector<int> vec(a.begin(), a.end());//初始化一个int类型的vector数组,元素与a迭代器总的元素相同
count(v.begin(), v.end(), val)	//返回数组v中值为val的元素的个数

//求最值
ranges::max(nums);	//返回数组最大值
int max_num = *max_element(nums.begin(), nums.end()); //获取最大值
ranges::min(nums);	//返回数组最小值
int min_num = *min_element(nums.begin(), nums.end());//获取最小值

reverse(vec.begin(),vec.end()); 		//反转vec
vec.insert(heights.begin(), val); 		//在vec的最开始了插入元素val
sort(vec.begin(), vec.end());			//升序排序
sort(a.begin(), a.end(), greater<int>());//逆序排序
int max_val = *max_element(vec.begin(), vec.end());

//二分查找相关
lower_bound(nums.begin(), nums.end(), val);//二分查找nums中第一个大于等于val的元素,返回它的迭代器
upper_bound(nums.begin(), nums.end(), val);//二分查找nums中第一个大于val的元素,返回其它它的迭代器
//注意1,对于同一个数组nums的两个迭代器itr1,itr2,它们的差值表示下标之差,利用这个性质,可以很方便的做出leecode第2563题
//注意2,迭代器前面加 "*" 可以直接返回这个迭代器指向的元素的值

lower_bound(nums.begin(), nums.end(), val) - nums.begin();//二分查找nums中第一个大于等于val的元素,返回其下标
upper_bound(nums.begin(), nums.end(), val) - nums.begin();;//二分查找nums中第一个大于val的元素,返回其下标
//注意3:可能发生越界的情况,如返回nums.size(),或者返回-1,这一点千万注意,参考leecode 1818

//结合上述两者,可以查找nums中值的大小在[a, b]内的元素个数,如下操作:
l = lower_bound(nums.begin(), nums.end(), a);
r = upper_bound(nums.begin(), nums.end(), b);
//此时r - l就是要求的结果,具体细节参考leecode 2563题:统计公平数对的数目

string相关:

string a = str.substr(start, length);		//切片操作,参数一是起始位置,参数二是要切的字符串有多长
string a = to_string(val);			//把数字val转换为字符串
int b = stoi(s);					//把字符串s转换为int类型的数字
reverse(s.begin(),s.end());			//反转字符串s

//判断某个字符或者字符串是否在string中:
str.find(ch);//判断字符ch是否在字符串str中,如果在,则返回下标,否则返回std::string::npos
str.find(s);//判断字符串s是否在字符串str中

//字符串处理操作
s = s1 + s2	//将s1,s2拼接为s1s2,结果返回给s
s = string(3, 't')	//此时s为 "ttt"
    

C++局部函数递归写法:

    function<int(int)> fib = [&] (int n) {
        if(n <= 2) return 1;
        else return fib(n-1) + fib(n-2);
    };
	cout<<fib(5);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GuiStar_李什么恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值