刷leetcode | c++基础函数
来源链接:https://blog.csdn.net/qq_41058526/article/details/86514368?utm_source=app
-
#include <iostream>
-
-
using namespace std;
-
-
struct SAMPLE
-
{
-
int x;
-
int y;
-
int add() {return x+y;}
-
}s1;
-
-
int main()
-
{
-
cout<<"没初始化成员变量的情况下:"<<s1.add()<<endl;
-
s1.x = 3;
-
s1.y = 4;
-
cout<<"初始化成员变量的情况下:"<<s1.add()<<endl;
-
system("pause");
-
return 0;
-
}
-
=>没初始化成员变量的情况下:0
-
初始化成员变量的情况下:7
sort用法:
sort函数使用模板:
sort(start,end,排序方法) ,排序对象
sort函数有三个参数:
1.第一个是要排序的起始地址。
2.第二个是要排序的结束地址。
3.第三个参数是排序的方法,默认的排序方法是从小到大排序。
第三个参数,排序方法的自定义:
sort()函数的强大之处是在它的第三个参数,排序方法,就是说可以任意的设定自己的规则,使排序对象按照自己指定的规则进行排序。特别是在对字符串数组进行比较时用处很大,可以很轻松的解决一些字符串排序的算法问题。
使用注意点:
sort的调用必须是静态成员,声明为static。
这样可以:
-
bool cmp(int a,int b){
-
string s1 = to_string(a)+to_string(b);
-
string s2 = to_string(b)+to_string(a);
-
return s1 < s2;
-
}
-
-
class Solution {
-
public:
-
// 判断a和b哪个应该排前面,而不是值的大小
-
// a排前面,则a+b < b+a
-
// 注意这里必须加static
-
-
string PrintMinNumber(vector<int> numbers) {
-
sort(numbers.begin(),numbers.end(),cmp);
-
string res = "";
-
for(auto &s:numbers){
-
res += to_string(s);
-
}
-
return res;
-
}
-
};
写在类内:必须加static
-
class Solution {
-
public:
-
// 判断a和b哪个应该排前面,而不是值的大小
-
// a排前面,则a+b < b+a
-
// 注意这里必须加static
-
static bool cmp(int a,int b){
-
string s1 = to_string(a)+to_string(b);
-
string s2 = to_string(b)+to_string(a);
-
return s1 < s2;
-
}
-
-
string PrintMinNumber(vector<int> numbers) {
-
sort(numbers.begin(),numbers.end(),cmp);
-
string res = "";
-
for(auto &s:numbers){
-
res += to_string(s);
-
}
-
return res;
-
}
-
};
优先队列 priority_queue
定义:
priority_queue<Type, Container, Functional>
functional自定义:
-
struct cmp{
-
bool operator() (const ListNode *h1,const ListNode *h2){
-
return h1->val > h2->val;
-
}
-
};
默认是大顶堆
一般是:
注意这里是与其他排序相反的
-
//大顶堆
-
priority_queue <int,vector<int>,less<int> >q;
-
//小顶堆
-
priority_queue <int,vector<int>,greater<int> > q;
-
-
-
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
1.string和int互转
(1)to_string(int)
(2)stoi(string)
2.struct函数的使用与初始化
https://blog.csdn.net/qian_youyou/article/details/79725018
https://blog.csdn.net/wenskys/article/details/48996933 (2)
3.容器:vector(类似于python的list)
(1)初始化:vector<int> res;
(2)插入置尾部:res.push_back(1);
(3)插入置头部:res.insert(res.begin(),cur->val);
vector.insert(pos,n,elem); 在pos位置插入n个elem数据,无返回值
(4)合并两个vector:res.insert(res.end(),temp.begin(),temp.end());
即res+temp
4.容器:queue
定义queue对象的示例代码如下:
queue<int>q1;
queue<double>q2;
queue的基本操作有:
1.入队:如q.push(x):将x元素接到队列的末端;
2.出队:如q.pop() 弹出队列的第一个元素,并不会返回元素的值;
3,访问队首元素:如q.front()
4,访问队尾元素,如q.back();
5,访问队中的元素个数,如q.size();
优先队列 priority_queue
定义:
priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般是:
-
//升序队列
-
priority_queue <int,vector<int>,greater<int> > q;
-
//降序队列
-
priority_queue <int,vector<int>,less<int> >q;
-
-
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
https://blog.csdn.net/weixin_36888577/article/details/79937886
基本函数:
-
和队列基本操作相同:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
初始化定义:
-
//升序队列
-
priority_queue <int,vector<int>,greater<int> > q;
-
//降序队列
-
priority_queue <int,vector<int>,less<int> >q;
-
-
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
5.容器:map
https://blog.csdn.net/sevenjoin/article/details/81943864
8.set && unordered_set
内部均无重复,set是顺序的,unordered_set不是
区别:https://blog.csdn.net/zhangxiao93/article/details/74357101
常用基本函数:https://www.cnblogs.com/caiyishuai/p/8646345.html
(1)set里面判断存在不存在
1.使用set.count(target)
2.使用set.find(target) != set.end()
(2)set初始化
使用vector初始化 unordered_set<string> word_set(wordDict.begin(),wordDict.end());
6.数组(固定大小,vector较为灵活)
http://www.cnblogs.com/haoyijing/p/5815035.html
-
1: 一维数组初始化:
-
2: 标准方式一: int value[100]; // value[i]的值不定,没有初始化
-
3: 标准方式二: int value[100] = {1,2}; // value[0]和value[1]的值分别为1和2,而没有定义的value[i>1]
-
4: // 则初始化为0
-
5: 指针方式: int* value = new int[n]; // 未初始化
-
6: delete []value; // 一定不能忘了删除数组空间
-
7:
-
8: 二维数组初始化:
-
9: 标准方式一: int value[9][9]; // value[i][j]的值不定,没有初始化
-
10: 标准方式二: int value[9][9] = {{1,1},{2}}; //value[0][0,1]和value[1][0]的值初始化,其他初始化为0
-
11: 指针方式一: int (*value)[n] = new int[m][n];
-
12: delete []value; // n必须为常量,调用直观。未初始化
-
13: 指针方式二: int** value = new int* [m];
-
14: for(i) value[i] = new int[n];
-
15: for(i) delete []value[i];
-
16: delete []value; // 多次析构,存储麻烦,未初始化
-
17: 指针方式三: int * value = new int[3][4]; // 数组的存储是按行存储的
-
18: delete []value; // 一定要进行内存释放,否则会造成内存泄露
-
19:
-
20: 多维数组初始化:
-
21: 指针方式: int * value = new int[m][3][4]; // 只有第一维可以是变量,其他几维必须都是常量,否则会报错
-
22: delete []value; // 一定要进行内存释放,否则会造成内存泄露
7.pair
https://blog.csdn.net/sevenjoin/article/details/8193769
9.位运算
(1)n = n >> 1 即做了除2操作
比如原来n是8,他的二进制数为00001000,进行>>1右移一位后就是00000100,4了.
>>
将二进制数右移,左边根据数字的正负形补0或者补1,正数补0,负数补1。<<
将二进制数左移,右边补0>>>
将二进制数右移,左边补0
(2)n & 1 判断n的奇偶性
进行位与运算,格式是:变量1&变量2,进行计算时,将会把类型提升为int。
“位与”运算是“位运算”的一种,运算法则是在二进制数下,相同位的两个数字都为1,则为1;若有一个不为1,则为0。&运算通常用于二进制取位操作,例如一个数 & 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
(3)0x
数字前导,表示是一个十六进制数而已。
一般情况下声明为数字,且是A-F开头的情况下可以不要前导。如:a0就是160。
但是你如何区分16是十进制下的16还是十六进制下的16,当然也有可能是8进制下的16!
这时数字前导是显然非常重要了!
0x16:表示十六进制下的16,即十进制下的22。
16:表示十进制下16。
016:表示八进制下的16,即十进制下的14。
所以0x表示这个数是十六进制的,0开头表示这个数是8进制的,1-9开头表示是十制下的数字。如果A_F开头,一般可以不加,便由于习惯,绝大多数人还是加上了!
(4)运算符
&&
表示逻辑与的意思,即为and。当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
比如 12&&23的结果就是1,12&&-1 的结果是1,123&&0的结果就是0
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException
&
表示按位与。
&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
二进制与运算规则:1&1=1 1&0=0 0&0=0
15&127为什么等于15啊?
15二进制: (0000 1111)
127二进制: (1111 1111)
按位与自然就是(0000 1111)=15
||
表示逻辑或
逻辑或,是逻辑运算符,符号是“||”(在PASCAL中为"or")。 “逻辑或”相当于生活中的“或者”,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”
12||1 =1 12||0 =1 0||0 =0
|
表示按位或
按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位(也就是最后一位)相或。只要对应的二个二进位有一个为1时,结果位就为1。
128: (0001 0000 0000)
127: (0000 1111 1111) (高位用0补齐)
按位或就是(0001 1111 1111)=255
~
按位取反操作符, 把操作数按照二进制的每一位值取反。