C++学习第二天(打卡)
C++ new 可以很方便的 分配一段内存。
比如 int *test= new int ;
int n;
cin>>n;
int * test =new int [n];
可以实现动态分配内存,比c的malloc 简洁多了,
同样也能new 一个 结构体。总之挺方便的。
new 之后 不用了 要用delet free 内存
另外对空指针delete 是安全的。
模板类:vector,也是一种动态数组。
用法 vector<typename> vt {n_elem};
模板类:array,不是动态滴~
用法 array<typename,n_elem> vt {};
C++的for循环多了一种新特性:可以基于范围。
for(double x:nums){
x=x*;
}
在for中 用于循环用的++i 和i++ 前缀格式和后缀格式,前缀格式 就将值加一,然后返回。
但后缀版本会首先复制一个副本,将其加1,然后将其复制的副本返回。
但是经过我 ida 看汇编的结构,确是相反的,这个问题
main proc near ; CODE XREF: _main_0↑j
.text:
.text: var_D8 = byte ptr -0D8h
.text: j = dword ptr -14h
.text: i = dword ptr -
.text:
.text: push ebp
.text: mov ebp, esp
.text: sub esp, 0D8h
.text: push ebx
.text:0041492A push esi
.text:0041492B push edi
.text:0041492C lea edi, [ebp+var_D8]
.text: mov ecx, 36h
.text: mov eax, 0CCCCCCCCh
.text:0041493C rep stosd
.text:0041493E mov [ebp+i],
.text: jmp short loc_414950
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_414947: ; CODE XREF: _main+↓j
.text: mov eax, [ebp+i]
.text:0041494A add eax,
.text:0041494D mov [ebp+i], eax
.text:
.text: loc_414950: ; CODE XREF: _main+↑j
.text: cmp [ebp+i],
.text: jge short loc_414987
.text: mov esi, esp
.text: push offset j_??$endl@DU?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@@AAV10@@Z ; std::endl<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &)
.text:0041495D mov edi, esp
.text:0041495F mov eax, [ebp+i]
.text: push eax
.text: mov ecx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@@A.gap0 ; std::basic_ostream<char,std::char_traits<char>> std::cout
.text: call ds:__imp_???$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(int)
.text:0041496F cmp edi, esp
.text: call j___RTC_CheckEsp
.text: mov ecx, eax
.text: call ds:__imp_???$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(std::basic_ostream<char,std::char_traits<char>> & (*)(std::basic_ostream<char,std::char_traits<char>> &))
.text:0041497E cmp esi, esp
.text: call j___RTC_CheckEsp
.text: jmp short loc_414947
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_414987: ; CODE XREF: _main+↑j
.text: mov [ebp+j],
.text:0041498E jmp short loc_414999
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_414990: ; CODE XREF: _main+AE↓j
.text: mov eax, [ebp+j]
.text: add eax,
.text: mov [ebp+j], eax
.text:
.text: loc_414999: ; CODE XREF: _main+6E↑j
.text: cmp [ebp+j],
.text:0041499D jge short loc_4149D0
.text:0041499F mov esi, esp
.text:004149A1 push offset j_??$endl@DU?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@@AAV10@@Z ; std::endl<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &)
.text:004149A6 mov edi, esp
.text:004149A8 mov eax, [ebp+j]
.text:004149AB push eax
.text:004149AC mov ecx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@@A.gap0 ; std::basic_ostream<char,std::char_traits<char>> std::cout
.text:004149B2 call ds:__imp_???$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(int)
.text:004149B8 cmp edi, esp
.text:004149BA call j___RTC_CheckEsp
.text:004149BF mov ecx, eax
.text:004149C1 call ds:__imp_???$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::basic_ostream<char,std::char_traits<char>>::operator<<(std::basic_ostream<char,std::char_traits<char>> & (*)(std::basic_ostream<char,std::char_traits<char>> &))
.text:004149C7 cmp esi, esp
.text:004149C9 call j___RTC_CheckEsp
.text:004149CE jmp short loc_414990
for (i = ; i < ; i++) {
cout << i << endl;
}
for (j = ; j < ; ++j) {
cout << j << endl;
}
恰恰相反。
const 这个标志符的作用也蛮大的,可以防止数据被修改,但是如果是一个指针指向一个变量,这个指针用了const,这样这个指针就不能修改这个数据,但是还是可以通过变量名字修改。
比较有趣的是函数指针,int (*pd)(int ); 可以直接把指针指向函数名就能执行了。用tpyedef 也能定义。挺有趣的。
今天在leetcode 做一道题的时候,遇到了一个问题:
runtime error: member access within null pointer of type 'struct ListNode'
while(l1!=NULL||l2!=NULL){
sum=;
if(l1->next!=NULL) {
y=l1->val;l1=l1->next;
}
if(l2->next!=NULL) {
y=l2->val;
l2=l2->next;
}
我就用了这种方法,后来想了想,看了下别人的,发现这个错误在哪里了,如果l1 或者l2 有一个已经为NULL的时候,这时还能进入while中,但是如果 (l1->next或者l2->next)的时候,那个已经为空的指针就会访问到,但是他是NULL NULL并没有->next利用引用,因为他不是ListNode 结构体。
今天也了解到 hashmap,hashmap 在遍历里面的元素时所用的时间复杂度为O(1);这样在某些题目中可以用空间获取时间来获得最优解。
Map<Integer,Integer> map = new HashMap<>();
map 有不少内置的方法可以使用,还不错。
C++学习第二天(打卡)的更多相关文章
- 深度学习多机多卡解决方案-purine
未经允许请不要转载,原作者:zhxfl,http://www.cnblogs.com/zhxfl/p/5287644.html 目录: 一.简介 二.环境配置 三.运行demo 四.硬件配置建议 五. ...
- 前端学习 第二弹: JavaScript中的一些函数与对象(1)
前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...
- 二、Android学习第二天——初识Activity(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 一. Android学习第二天——初识Activity 昨天程序搭建成功以 ...
- python学习第二讲,pythonIDE介绍以及配置使用
目录 python学习第二讲,pythonIDE介绍以及配置使用 一丶集成开发环境IDE简介,以及配置 1.简介 2.PyCharm 介绍 3.pycharm 的安装 二丶IDE 开发Python,以 ...
- python学习第二次笔记
python学习第二次记录 1.格式化输出 name = input('请输入姓名') age = input('请输入年龄') height = input('请输入身高') msg = " ...
- 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验【中英】
[中英][吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第二周测验 第2周测验 - 神经网络基础 神经元节点计算什么? [ ]神经元节点先计算激活函数,再计算线性函数(z = Wx + ...
- Learning ROS for Robotics Programming - Second Edition(《ROS机器人编程学习-第二版》)
Learning ROS for Robotics Programming - Second Edition <ROS机器人编程学习-第二版> ----Your one-stop guid ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第二周
学习第二周(Java基本程序设计结构) 这一周,着重学习了Java的简单程序设计实现及运行,通过自己操作,发现Java的程序语法大面 ...
- oracle学习 第二章 限制性查询和数据的排序 ——03
这里.我们接着上一小节2.6留下的问题:假设要查询的字符串中含有"_"或"%".又该如何处理呢? 開始今天的学习. 2.7 怎样使用转义(escape)操作符 ...
- Python学习-第二天-字符串和常用数据结构
Python学习-第二天-字符串和常用数据结构 字符串的基本操作 def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1 ...
随机推荐
- Java根据参数返回相应类
问题初衷:如何根据参数变换方法的返回类型(参数为 类) 解决方案: 下面方法是放在工具类(例:YslRequestUtil) public <T> T response(Object re ...
- 使用 Django 项目中的 ORM 编写伪造测试数据脚本
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 为了防止博客首页展示的文章过多以及提升加载速度,可以对文章列表进行分页展示.不过这需 ...
- 设计模式(九)Bridge模式
Bridge模式就是将类的功能层次结构和类的实现层次结构连接起来. 类的功能层次结构就是根据实际非抽象类来说的,也就是父类具有基本功能,然后在子类中增加新功能.用于增加新功能. 类的实现层次结构就是根 ...
- Dotween 应用
dotween是做缓动比较简单实用的插件,下面就使用经验进行浅谈 1)通用方法:如下图官网截图所示,如果看不懂可以跳过,这是一个通用方法,前两个参数为委托类型,可以用lambda表达式,也可以直接写成 ...
- JVM三部曲之运行时数据区 (第一部)
在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运行时数据区域: 在运行时数据区里存储类Class文件元数据(方法区),对象和数组(堆),方法参数局部变量( ...
- vue之页面缓存问题(基于2.0)
为什么会有这篇文章 在vue2.0中出现了列表页面是每次都重新加载数据,但是详情页面却只在第一次加载的时候调用数据,如果返回到列表再进入详情那么页面是不会重新渲染页面. 1 用vue-router 重 ...
- Android H5混合开发(4):构建Cordova Jar包
前言 上一节,介绍了原生项目如何嵌入Cordova,我们对Cordova的依赖使用的是CordovaLib Module,这也是安卓项目常用的方式. 但是,也有项目希望以Jar包的方式依赖Cordov ...
- SpringCloud 中集成Sentinel+Feign实现服务熔断降级
Sentine 1.背景 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳 ...
- Nginx 的请求处理流程,你了解吗?
之前我们已经讲解了 Nginx 的基础内容,接下来我们开始介绍 Nginx 的架构基础. 为什么我们要讨论 Nginx 的架构基础? 因为 Nginx 运行在企业内网的最外层也就是边缘节点,那么他处理 ...
- CSPS模拟 94
以后干脆不要在准备提交的代码里放调试信息. 再也不忘删printf可是memset还是看不见... T1 玄学错误,不想研究.skyh帮我研究出来了.HACKDATA:1 1 T2 傻逼做法. 发现一 ...