pointerArray
前言分析一下编译器vs2022对数组的访问操作。
正文先参照一下视频的分析
汇编这玩意,看着看着倒是顺眼了,前提是简单的操作。
mov eax,4 就是类似于eax=4
imul ecx,eax,0 是 eax*0之后赋值给ecx,不过都乘以0了,ecx也就是0了
lea edx,[ebp+ecx-1Ch] ecx是0在上一步有说明了,就剩ebp-1Ch的地址传递给edx
mov dword ptr [ebp-28h],edx 这一步就是将[ebp-28h]的这段空间写入edx,也就是[ebp-1Ch]
mov eax,dword ptr [ebp-28h] ,这里[ebp-28h]已经写入了之前说的edx的值[ebp-1Ch],相当于eax=edx了
mov dword ptr [eax],5 ,因为之前也说了eax=edx,所以这里给eax=5,就是变相的给edx=5然后回头看,能说什么说明?说明edx的那段内存地址是属于a[0]的,而[ebp-28h]的那段空间就是指针占用的部分,换种写法就是[ebp-28h] ...
pointer
c/c++的万恶之源
指针
概念指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。——摘自百度
因为运行一个程序,需要消耗内存,程序当中的变量各自有占用的地方,通常以十六进制表示,用visual studio反汇编的时候就能看到前面有一串长的字符。
正文不同类型的变量所占用的内存也各不相同,有基础的应该都知道,目前先不说32位操作系统的情况,以64位操作系统为例。
tips:int 类型占用 4字节 = 32比特,一个比特可以表示0或者1
指针的要素就是要操作对象的内存地址和大小
基础语法123//数据类型* 变量名称;例如:int *p;//int* p; 都可以,*在前或在后都是表示指针,取决于使用者的习惯。
初试指针打开编译器,运行:
12345678int main( ...
std::vector
参考
vector头文件
IDE:vs 2022
定义
std::vector<数据类型> 变量名;
std::vector v; //基本定义
std::vector v1{ 1,2,3,4,5 }; //直接初始化
std::vector v2(5); //成员容量为五个
std::vector v3(5, 100); //五个成员均为100
正文容器方面,对成员的访问方式都可以通过[],即:
123456int main(){ std::vector<int> v{1,2,3,4,5}; std::cout << v[2] << std::endl; //合法 return 0;}
size()这个不多说,跟之前的array一样,返回vector的成员个数。
push_back()1234567in ...
std::array
参考
c++11标准特性
IDE:vs 2022
定义
定义时必须指定大小,且不能使用变量指定
可以通过arry构造新的array,{}也合法
不可以使用数组构造,即arry = ch是不合法的操作
本质上任然是一个固定大小的数组,不能删除或者添加元素。
注意如果使用了using namespace std,则后续代码可以无视std::前期先保持基础写法。
前言在c语言和c++中,传统方式上定义一个数组可以用:
12int ch[10] = {0};int *ch2 = new int[10];
两者区别不大,前者由系统自动分配到栈区,后者在堆区上开辟空间并用指针指向它。
正文使用array前,需引用头文件;
123std::array<int, 2> ary = { 0,1 };//或者不用=也一样std::array<int, 2> ary2 { 0,1 };
size()array内置size()方法,可以直接返回array数组有几个成员。
传统上我们需要知道数组 ...
<cctype>
参考
cctype头文件
包含的函数
字符处理函数
函数
说明
isupper(char)
如果参数是大写字母,函数返回true
islower(char)
如果参数是小写字母,函数返回true
isalpha(char)
如果参数是字母,函数返回true
isdigit(char)
如果参数是数字(0-9),函数返回true
isalnum(char)
如果参数是字母数字,即字母或者数字,函数返回true
isspace(char)
如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true
isblank(char)
如果 ...
cpp查漏补缺
查漏补缺随意版—— 有些记得住有些靠记录,至于看不看...
额。。兜兜转转感觉对安全之类的兴趣一般,还是又回头重拾c++了,说来也惭愧,c++倒是还记得点,qt框架因为当时b站只弄过一个翻金币的小游戏,所以经验不足。先花点时间把c++重新过一遍,然后找qt项目练手~ 不然工作要g了。
强制类型转换
语言
转换过程
举例
c++
static_cast(value)
int a = static_cast(a+b)
c
type(value)
int a = int(a+b)
字符
类型
占用
说明
char
1
ascii字符
wchar_t
2
宽字节字符
char16_t
2
utf_16字符
char32_t
4
utf_18字符
输入wchar_t变量时需要使用wcout输出,定义时需加L16和32目前输出都是数字,区别在于占用的内存
推断类型
auto
auto 变量名{初始值}
大多情况不会使用auto,因为c和c++都是强语言,他对变量的声明还是要求较为严格的
1type ...
leetcode第二十题
参考
string
前言
三种类型的括号要么按顺序两两一对,要么首尾一对对内嵌。
根据示例2
输入:s = “()[]{}”输出:true
示例4
输入:s = “{[]}”输出:true
看到具体效果。
正文正常看到这个题目,原本是想通过string的replace去替换掉一组成员,然后循环判断,但是c++的replace不是很好使就算了。。。
那就按照关系,去看一下ASCII码,发现这几个括号之间相差1或2的情况。如下图第三列情况:
那么在if关系中应该是
1if(s[i]+1 == s[i+i] || s[i]+2 == s[i+i])
当然这种情况是括号两两一对按序排列的理想情况
123456789101112131415161718192021class Solution {public: bool isValid(string s) { int n = 0, n2 = 0; int len = s.length(); ...
leetcode第十四题
前言继续划水做做看
参考
string
length
正文
看到这个就想用两个for跑,用一个string变量+=。
初始代码:
123456class Solution {public: string longestCommonPrefix(vector<string>& strs) { }};
假设第一层for循环跑strs的个数,第二个跑str[i]的长度,那么如果需要比较的话就又得多一层循环,三层其实有点多了,不是很好的办法。
……想了半天,既然是前缀之间的比较,那么假设循环的长度根据strs[0].length(),那么无论[0]的长度是最长还是最短,无非就三个结果,要么正好是他,要么是其中几个,要么都不是。
123456for(int i = 0; i < strs[0].length(); i++){ //用str[0]作为对象与后面的比较 for(int j = 1; j < strs.size(); j++){ ...
leetcode第十三题
前言额想了个把小时都没有很好的主意去处理六个特殊情况。
参考
switch
string
正文
提示:
1 <= s.length <= 15
s 仅含字符 (‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’)
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
好处是罗马数字就七种字符,坏处有特殊的组合且字符串s长度不超过15,转换后的整数范围不超过3999,这样倒是不用担心越界了。
初始代码:
123456class Solution {public: int romanToInt(string s) { }};
最后返回转换的罗马数字即可。
初解因为就7个字符,感觉可以用switch直接套,不然用map再套一层好像增加空间了。
12345678910111213 ...
leetcode第九题
前言先按难度往下走,因为数据结构还没理清。
参考c++ string:
length —— 返回字符串长度
size —— 返回字符串长度
注意:strlen是以char*去计算字符串长度直到‘\0’结束,本题用不到。
c++ vector:
size —— 获取vector容器元素个数
operator[] —— 类似数组根据下标返回元素值
正文回文数
c++给到的代码框架:
1234567class Solution {public: bool isPalindrome(int x) { }};
bool型函数,返回true或false即可
根据现有条件可以排除x<10的情况,因为个位数不可能存在回文现象,而两位数的10也不存在,负数更不用说,多了个-号;故此首先判断x<10,如果成立直接返回false;
1234567891011class Solution {public: bool isPalindrome(int x) { if(x < 10 ...