各种输入输出
函数指针
realloc
动态数组
int* p=new int[100];
delete []p;
不能单独删除p[1]的地址,只能整体删除
类内使用sort
类内的函数有一个隐含的变量,this指针
参考
自定义的类使用优先队列
参考
优先队列使用自定义的比较函数时,比较函数写在类里面,且要在构造函数里面指明优先队列的实现方式,一般使用vector
运算符重载
本质上是一个函数,返回值,函数名字是operator加上待重载的运算符,后面跟上函数参数和函数体
class Data{
public:
int data;
int index;
Data(){
}
Data(int a,int b):index(a),data(b){
}
};
bool operator<(Data a,Data b){
if(a.index==b.index)
return a.data<b.data;
else
return a.index<b.index;
}
bool operator>(Data a,Data b){
return !(a<b);
}
int main() {
vector<Data> data;
data.emplace_back(1,2);
data.emplace_back(3,4);
data.emplace_back(3,1);
sort(data.begin(),data.end(),greater<Data>());
for(auto& d:data)
cout<<d.index<<" "<<d.data<<endl;
return 0;
}
sort中不使用greater时默认使用less
sort函数、优先队列等需要重载小于号的重载函数,重载参数里面应不应该用引用???
尤其是优先队列更是存疑
力扣347题重载方式,加不加引用反正都能通过
字符串按某个字符分割
int main() {
string inputStr("zx zx zx zx zx zx");
std::stringstream ss(inputStr);
std::string str;
int i=0;
while (getline(ss, str, ' ')){
cout<<str<<endl;
}
return 0;
}
判断两字符串是否有相同字符
参考
以下代码仅适用于只含有小写字母的情况。如果字符串中含有128种字符则应将num1和num2的数据类型修改为long long。因为int只有32位
两字符串含有相同种类的字符时认为相同,数量可以不一样
bool judge(string s1,string s2){
int num1=0,num2=0;
for(int i=0;i<s1.size();++i)
num1=num1|1<<(s1[i]-'a');
for(int i=0;i<s2.size();++i)
num2=num2|1<<(s2[i]-'a');
cout<<bitset<32>(num1)<<endl;
cout<<bitset<32>(num2)<<endl;
if((num1&num2)==0)
return false;
else
return true;
}
int main() {
cout<<judge("abc","def");
return 0;
}
//00000000000000000000000000000111
//00000000000000000000000000111000
//1
位运算
参考
与运算:
1.将某些位置零 0101&1100=0100 与零得零,与一不变
2.取特定位 上面的方法就固定的取出了前两位
3.判断奇偶数 a&1==0偶数,否则奇数
或运算:
1.将某些位置一 0101|0011=0111 或零不变,或一得一
异或运算^相同为0,不同为1
1.翻转某些位 0101^0011=0110 异或零不变,异或1翻转
2.交换两个数
void Swap(int &a, int &b){
if (a != b){
a ^= b;
b ^= a;
a ^= b;
}
}
无穷大与整形范围
auto max = INT32_MAX;
auto inf = -std::numeric_limits<float>::infinity();
cout<<inf;
原码反码补码
正数的三种码都是相同的
负数的反码是符号位不变,其余取反,补码是反码+1
补码与真值间的转换公式:
各种数字在计算机内部都是补码存储,所以LeetCode中的0508题,给出的补码形式,有些不能直接使用stoi。stoi是按公式计算int,如果想转换成负数,s中应有负号。