一个为周赛准备的 C++ cheatsheet
注释中是变量占的字节数。
sizeof(char) //1
sizeof(char*) //4
sizeof(int) //4
sizeof(int*) //4
sizeof(double) //8
sizeof(double*) //4
sizeof(float) //4
sizeof(float*) //4
sizeof(string) //28
sizeof(string*) //4
sizeof(char) //1
sizeof(char*) //8
sizeof(int) //4
sizeof(int*) //8
sizeof(double) //8
sizeof(double*) //8
sizeof(float) //4
sizeof(float*) //8
sizeof(string) //40
sizeof(string*) //8
INT_MAX = 2^31-1=2147483647 INT_MIN = -2^31=-2147483648 也可以写成 Integer.MAX_VALUE 和 Integer.MIN_VALUE。
数组的赋值:
//1
int mat[10][10];
memset(mat,0,sizeof(mat));
//2
int mat[10][10]={0}; //初始化为0
判断字符是否是数字:bool isNum=Character.isDigit(ch)
,是数字返回 true,不是返回 false。
固定大小数组,支持快速随机访问,不能添加或删除元素。
定义迭代器:vector<int>::iterator iter;
遍历迭代器:
vector<int> ivec;
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
删除迭代器指向的内容:
ivec.erase(iter);
删除迭代器指向的元素之后,当前迭代器的指向的单元没有变,而是先清空当前单元,然后后面单元的内容一个接一个移动到了前一个单元。
移动迭代器 advance() 函数用于将迭代器前进(或者后退)指定长度的距离,其语法格式如下:
template <class InputIterator, class Distance>
void advance (InputIterator& it, Distance n);
其中 it 指的是目标迭代器,n 通常为一个整数。
需要注意的是,如果 it 为输入迭代器或者前向迭代器,则 n 必须为一个正数,即表示将 it 右移(前进) n 个位置;反之,如果 it 为双向迭代器或者随机访问迭代器,则 n 为正数时表示将 it 右移(前进) n 个位置,n 为负数时表示将 it 左移(后退) n 个位置。
#include<iostream>
using namespace std;
int main()
{
string str="hello";
string s="Hahah";
str.insert(1,s);//在原串下标为1的字符e前插入字符串s
cout<<str<<endl;
string str1="hello";
char c='w';
str1.insert(4,5,c);//在原串下标为4的字符o前插入5个字符c
cout<<str1<<endl;
string str2="hello";
string s2="weakhaha";
str2.insert(0,s2,1,3);//将字符串s2从下标为1的e开始数3个字符,分别是eak,插入原串的下标为0的字符h前
cout<<str2<<endl;
return 0;
}
删除空格:str = str.trim();
string 转 int int num=stoi(str.c_str())
stack<T> st;
st.empty(); //如果栈为空则返回true, 否则返回false;
st.size(); //返回栈中元素的个数
st.top(); //返回栈顶元素值, 不弹栈
st.pop(); //弹栈,注意不返回其值
st.push(); //压栈
想要多次遍历栈,但是又保护栈的结构,以下是一种可能的方法:
vector<T> v;
while (!st.empty())
{
v.push_back(st.top());
cout << st.top() << " ";
st.pop();
}
for(int i=v.size()-1;i>=0;i--)
{
st.push(v[i]);
}
map在增加元素时,不需要判断key是否存在,在用[]
访问时,如果key存在那么就正常取value,否则不会报错,会取value对象默认构造的值,且这个键值对会被插入到map中。比如value为 string对象,则构造空串;value为int对象,构造为0。
unordered_map 在插入键的时候不会进行排序,所以一般不需要排序的哈希表用 unordered_map 来实现。
set<T> st;
st.begin(); //返回第一个元素
st.end(); //返回s最后一个元素
st.clear(); //删除s所有的元素
st.empty(); //判断s是否为空
st.size(); //返回元素个数
st.max_size() //可存储的最大元素个数
int element=5;
//判断元素是否在集合set中,存在返回1,不存在返回0
st.count(element);
//添加元素
st.insert(element);
//删除元素
auto it = st.begin();
st.erase(*it);
pair是可以比较大的,先按first比较,如果相等,再按照second比较。
- accumulate: 求和
前两个参数是求和的元素的范围,第三个是和的初始值。
int sum = accumulate(vec.begin(),vec.end(),0);
- equal:确定序列是否保存相同的值。
- 三个迭代器,前两个表示第一个序列中的元素范围,第三个表示第二个元素的首序列。
- 要求第二个序列长度不小于第一个序列。
[capture](parameters)->return-type{body}
//[捕获列表](参数列表)->返回类型-{函数主体}
#include<iostream>
using namespace std;
int main(){
int x=1,y=2,z=0;
auto add = [&z](auto x,auto y){z=x+y;return z;};
auto res = add(x,y);
cout<<res<<z<<endl;
}
例子:
vector<pair<int,int>> costs;
auto compare = [&](const auto& a,const auto& b ){
if (a.first != b.first)
return a.first > b.first;//价值不同时,价值大的优先
else
return a.second < b.second;//价值相同时,标号小的优先
}
sort(costs.begin(),costs.end(),compare);