关于C++学习

1.对于指针 *p和变量a ,p和&a是地址,*p和a是该地址存储的变量的值
2.int *ptr = NULL,则ptr=00000000,而NULL=0
3.对于指针*ptr ,ptr++,等价于:若是int,则ptr+=4;若是char,ptr+=1,总之取决于指针的类型,它自加的目的是指向下一个该类型的值
4.对于数组var[3]={1.2.3},var就是一个指针常量,即*var=1(即数组第一个数的值),而var是数组第一个值的地址值,*var可以看成(3)中的*ptr,唯一的区别就是,var是一个常量,他不可以改变(但是结构体的对象也可以看作指针,但他不是常量指针,是个正常的指针)
5.对于指针 *ptr ,ptr的值是*ptr的地址&*ptr,但同时ptr本身也有个地址,是不同的。所以*ptr 可以看作两个变量的组合,*ptr和ptr都是变量,他们的地址和值都不同
6.对于指向指针的指针 **ptr,就是 *+*ptr,造成的结果就是对于指针 *ptr,他的值*ptr=&**ptr,他的地址ptr=&*ptr,两个都是地址
7.当指针与函数做交互时,接受指针的一方使用值,发送指针的一方使用地址,如:函数的形参是指针,则调用函数时需要地址,如: 定义函数int a(int *b): 使用函数:a(&b) 又如定义函数 int *a():{return &b}
8.类的对象,其值是地址,this也代表地址,和数组一样
9.如何区分0和NULL,你就看变量的地址是不是NULL就行,别看值,0只是变量的值是0,但NULL是变量的地址和值都是0
10.字符转整数,可以通过ascii值运算,比如 '9'-'0'得出来的就是int 型的9
11获取变量类型 cout <<typeid('9' - '0').name() << endl; 结果就是int
12.ascii对照表
在这里插入图片描述
13.二维向量,就是对于二维向量,它里面的元素类型是一维向量,一维向量的定义是vector<type>,对于二维向量,type=vector<type>,所以二维向量的定义是vector<vector<type>>
14.vector<vector<int>> f(sL+1,vector<int>(pL+1)),sL+1表示f有多少个一维向量,vector<int>(pL+1)则代表他的类型是int型,大小为pL+1的一维向量
15.万能头文件#include <bits/stdc++.h>,但是vs不自带该头文件,需要自己手动添加,我参考的是VS添加<bits/stdc++.h>
16.跳出多重循环,用goto方法,如果是函数内的话,可以用return直接退出整个函数

for(int i=0; i<10 ;i++{
	for(int j=0; j<10; j++){
		if(j=10){
			goto here;//这里是分号
		}		
	}
}
here://这里是冒号

17.有些编程题因为数据结果可能值会溢出,要求取模。取模的意思就是取余数,就是用 %
18.在while循环里使用continue时,要注意参数迭代是在哪里,如下

while (i < 10) {
	if (i == 5) {
		//i++  //i++如果不添加的话,就会陷入死循环
		continue;
	}
	i++;
}

19.string.erase(i)是切割掉索引为 i 的后面所有字符,要想只删除指定位置字符,应该 string.erase(i,1) 后面的 1 是指删除索引为 i 长度为 1 的子字符串,也就是删除该位置的那个字符
20.若int溢出了,可以用long,甚至long long,注意相关的地方也都得改
21.int_max之所以是2……31-1,是因为,int型占4个字节的大小,一字节8bit位,又最高位是符号位,0表示正数,所以最大值就是31个1,所以是2^31-1,而负数最小可以是32个1,因为最高位1本就可以表示负数。
22.VS“无法查找或打开PDB文件”是怎么回事?如何解决
调试->选项->勾选->调试->常规->勾选启用源服务器支持->符号->勾选microsoft符号服务器->选择合适的目录->确定
23.m-m%10只是减去个位的数,而不是缩减一位,缩减一位应该是m/10
24.a+=b*10不是添加一位数,只是加了一个数10*b,正确应该是 a=a*10+b
25.用if else赋值的另一种写法

	if (condition) {
		a=A;
	}
	else {
		a=B;
	}
//等价于
	a = B;
	if (condition) {
		a = A;
	}

26.for(int i=1;i<0;i++){}不会报错,只是不会执行循环的内部代码
27.匿名函数

bool isMatch(string s, string p) {

        auto matches = [&](int i, int j) {
            if (i == 0) {
                return false;
            }
            if (p[j - 1] == '.') {//匿名函数好处就是可以直接使用外部的变量,这里可以直接使用s,p
                return true;
            }
            return s[i - 1] == p[j - 1];
        };
        if(matches(1,2));//匿名函数但不是真的匿名,只不过其函数名就直接成为了一种变量。
//缺点就是不能递归

28.int 和 bool就数值而言好像都是1和0,没啥区别
29."." 会报错,只能是 '.'
30.c++中字典可以用 map来表示,或者也可以用两个等长的数组,用索引i作为两者的桥梁

map<string,int> roman;

class Solution {
public:
    Solution();
private:
    map<int, string> roman;
};

Solution::Solution() {
    roman.insert(pair<int, string>(1, "I"));
    roman.insert(pair<int, string>(4, "IV"));
    roman.insert(pair<int, string>(5, "V"));
    roman.insert(pair<int, string>(9, "IX"));
    roman.insert(pair<int, string>(10, "X"));
    roman.insert(pair<int, string>(40, "XL"));
    roman.insert(pair<int, string>(50, "L"));
    roman.insert(pair<int, string>(90, "XC"));
    roman.insert(pair<int, string>(100, "C"));
    roman.insert(pair<int, string>(400, "CD"));
    roman.insert(pair<int, string>(500, "D"));
    roman.insert(pair<int, string>(900, "CM"));
    roman.insert(pair<int, string>(1000, "M"));
}

31.在leedcode中,字符串的连接用append方法比用+=方法可以更快
32.string.append(char)是错误的
33.二维向量添加元素的方法

vector<vector<int>> result;
result.push_back(vector<int>{nums[i], nums[j], nums[k]});

//或者
vector<vector<int>> result;
vector<int> aresult;

aresult.push_back(0);
aresult.push_back(0);
aresult.push_back(0);
result.push_back(aresult);
aresult.clear();

34.字符串string末尾添加字符char

//正确
string s = "afsd";
char q = 'a';
cout << s + q << endl;
cout << s + 'a' << endl;
//错误做法
cout << "afsd" + 'a' << endl;

35.类的私有对象不可以在定义的时候初始化,要么通过析构函数,要么在创建对象的时候赋值
36.d = a ? b : c 如果a为真,则 d = b, 否则 d = c
37.指针要用地址来初始化,是因为,其实指针真正的定义,int *p定义的变量是p,也就是变量名叫p,而不是*p,准确的说就是变量p,名字叫p,类型是int*,也就是整形指针,所以指针的创建更合理的写法是int* p,只不过现在它和写法int *p等价了,所以就会出现 int *p=&a;其实是int* p=&a;这样子就不会和*p是地址p上存储的值这个定义产生误解了。
38.无论函数的参数如何定义,参数真正的名字就是那个单词,类型也是那个单词的类型。如:void a(int *p,int &b),他的形参是p和b,不是*p和&b,所以调用该函数的方式为a(&c,d),函数的参数&b代表的意思是参数是引用传递不是值传递。即b和d共用同一个地址空间,即&b == &d是true

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值