基本数据运算:
累加:
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);