欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

刷leetcode | c++基础函数

程序员文章站 2022-07-15 19:56:29
...

来源链接:https://blog.csdn.net/qq_41058526/article/details/86514368?utm_source=app

结构体定义

  1. #include <iostream>
  2. using namespace std;
  3. struct SAMPLE
  4. {
  5. int x;
  6. int y;
  7. int add() {return x+y;}
  8. }s1;
  9. int main()
  10. {
  11. cout<<"没初始化成员变量的情况下:"<<s1.add()<<endl;
  12. s1.x = 3;
  13. s1.y = 4;
  14. cout<<"初始化成员变量的情况下:"<<s1.add()<<endl;
  15. system("pause");
  16. return 0;
  17. }
  18. =>没初始化成员变量的情况下:0
  19. 初始化成员变量的情况下:7

 

sort用法:

sort函数使用模板: 
sort(start,end,排序方法) ,排序对象

sort函数有三个参数: 
1.第一个是要排序的起始地址。 
2.第二个是要排序的结束地址。 
3.第三个参数是排序的方法,默认的排序方法是从小到大排序。 

 

第三个参数,排序方法的自定义:

sort()函数的强大之处是在它的第三个参数,排序方法,就是说可以任意的设定自己的规则,使排序对象按照自己指定的规则进行排序。特别是在对字符串数组进行比较时用处很大,可以很轻松的解决一些字符串排序的算法问题。

使用注意点:

sort的调用必须是静态成员声明为static

这样可以:

  1. bool cmp(int a,int b){
  2. string s1 = to_string(a)+to_string(b);
  3. string s2 = to_string(b)+to_string(a);
  4. return s1 < s2;
  5. }
  6. class Solution {
  7. public:
  8. // 判断a和b哪个应该排前面,而不是值的大小
  9. // a排前面,则a+b < b+a
  10. // 注意这里必须加static
  11. string PrintMinNumber(vector<int> numbers) {
  12. sort(numbers.begin(),numbers.end(),cmp);
  13. string res = "";
  14. for(auto &s:numbers){
  15. res += to_string(s);
  16. }
  17. return res;
  18. }
  19. };

写在类内:必须加static

  1. class Solution {
  2. public:
  3. // 判断a和b哪个应该排前面,而不是值的大小
  4. // a排前面,则a+b < b+a
  5. // 注意这里必须加static
  6. static bool cmp(int a,int b){
  7. string s1 = to_string(a)+to_string(b);
  8. string s2 = to_string(b)+to_string(a);
  9. return s1 < s2;
  10. }
  11. string PrintMinNumber(vector<int> numbers) {
  12. sort(numbers.begin(),numbers.end(),cmp);
  13. string res = "";
  14. for(auto &s:numbers){
  15. res += to_string(s);
  16. }
  17. return res;
  18. }
  19. };

 

优先队列 priority_queue

定义:

priority_queue<Type, Container, Functional>

functional自定义:

  1. struct cmp{
  2. bool operator() (const ListNode *h1,const ListNode *h2){
  3. return h1->val > h2->val;
  4. }
  5. };

默认是大顶堆
一般是:

注意这里是与其他排序相反的

刷leetcode | c++基础函数

  1. //大顶堆
  2. priority_queue <int,vector<int>,less<int> >q;
  3. //小顶堆
  4. priority_queue <int,vector<int>,greater<int> > q;
  5. //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 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般是:

  1. //升序队列
  2. priority_queue <int,vector<int>,greater<int> > q;
  3. //降序队列
  4. priority_queue <int,vector<int>,less<int> >q;
  5. //greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

https://blog.csdn.net/weixin_36888577/article/details/79937886

基本函数:

  • 和队列基本操作相同:

  • top 访问队头元素
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace 原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容

初始化定义:

  1. //升序队列
  2. priority_queue <int,vector<int>,greater<int> > q;
  3. //降序队列
  4. priority_queue <int,vector<int>,less<int> >q;
  5. //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. 1: 一维数组初始化:
  2. 2: 标准方式一: int value[100]; // value[i]的值不定,没有初始化
  3. 3: 标准方式二: int value[100] = {1,2}; // value[0]和value[1]的值分别为1和2,而没有定义的value[i>1]
  4. 4: // 则初始化为0
  5. 5: 指针方式: int* value = new int[n]; // 未初始化
  6. 6: delete []value; // 一定不能忘了删除数组空间
  7. 7:
  8. 8: 二维数组初始化:
  9. 9: 标准方式一: int value[9][9]; // value[i][j]的值不定,没有初始化
  10. 10: 标准方式二: int value[9][9] = {{1,1},{2}}; //value[0][0,1]和value[1][0]的值初始化,其他初始化为0
  11. 11: 指针方式一: int (*value)[n] = new int[m][n];
  12. 12: delete []value; // n必须为常量,调用直观。未初始化
  13. 13: 指针方式二: int** value = new int* [m];
  14. 14: for(i) value[i] = new int[n];
  15. 15: for(i) delete []value[i];
  16. 16: delete []value; // 多次析构,存储麻烦,未初始化
  17. 17: 指针方式三: int * value = new int[3][4]; // 数组的存储是按行存储的
  18. 18: delete []value; // 一定要进行内存释放,否则会造成内存泄露
  19. 19:
  20. 20: 多维数组初始化:
  21. 21: 指针方式: int * value = new int[m][3][4]; // 只有第一维可以是变量,其他几维必须都是常量,否则会报错
  22. 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

 

~

按位取反操作符, 把操作数按照二进制的每一位值取反。