现代程序设计 homework-08
现代程序设计 homework-08
第八次作业。
理解C++变量的作用域和生命周期
作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域;而生命周期就是这个变量可以被引用的时间段。不同生命周期的变量,在程序内存中的分布位置是不一样的。一个程序的内存分为代码区、全局数据区、堆区、栈区,不同的内存区域,对应不同的生命周期。
int* aa(int a)
{
int b = a;
return &b;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i=;
if (i==){int* p = &i;}//这里的p的作用域在if语句中
int* p = aa(); //可以再次定义p,因为上面的p的生命周期已完结
cout<<&p<<endl; //不能正确输出,因为指针所指地址生命周期已经完结
return ;
}
理解堆和栈,两种内存的申请和释放的方式
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
简单来说,栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
一下用简单的代码说明C++中堆和栈:
int a = ; // 全局初始化区
char *p1; // 全局未初始化区
main()
{
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = ""; // 123456\0在常量区,p3在栈上。
static int c =; // 全局(静态)初始化区
p1 = (char *)malloc();
p2 = (char *)malloc(); // 分配得来得10和20字节的区域就在堆区。
strcpy(p1, ""); // 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
理解unique_ptr和shared_ptr
首先,智能指针都具有普通指针的功能。
unique_ptr是一种不能共享的智能指针,我们不能复制它、在函数中传递它的值或者是在需要使用其副本的STL中使用。总之,unique_ptr所指向的内存只能被它所指,如果其他unique_ptr想要指向同一块内存,需要使用move()语句。
shared_ptr是可以共享地址的指针。其实就是不同于unique_ptr的一种存在。一个shared_ptr可以被复制,给其他shared_ptr赋值,许多shared_ptr指向同一的内存,并都可以修改所指地址中内容。shared_ptr之所以智能,就是当指向一个存储块的shared_ptr数量减至0时(超出生命周期等原因),该存储块会被自动释放。
用“C++0x”,“C++11 & STL”两种不同的代码风格分割一个url,并上传代码到博客上
代码如下:
#include "stdafx.h"
#include <stdio.h>
#include <regex>
#include <string>
#include <iostream>
using namespace std; class urlDiv
{
public:
urlDiv()
{
str = "";
isUrl = true;
}
urlDiv(string s)
{
str = s + '#';
isUrl = true;
}
void divStr()//C++0x风格
{
resL = ;
string tmp = ""; //暂存字符串
bool hasC = false; //是否出现':'
//string tmpDiv = "";
int i=;
while (i < str.length())
{
if ((str[i]<='z' && str[i]>='a')||(str[i]<='Z' && str[i]>='A')||(str[i]<='' && str[i]>='')||str[i]<) //数字字母或中文
{
tmp+=str[i];
}else
{
if (str[i]==':') //当前字符为':'判断
{
if (i<str.length()- && hasC==false) //判断后两位是否为"//"
{
if (str[i+]=='/' && str[i+]=='/')
{
hasC = true;
result[resL++] = tmp;
tmp="";
i+=;
}else
{
isUrl = false;
return;
}
}else
{
isUrl = false;
return;
}
}else if (str[i] == '-' || str[i] == '_')//-_正常连接
{
tmp+=str[i];
}else if (str[i] == '.' || str[i] == '/' || str[i]=='#')//只用'.' '/' '#'分割,其中手动'#'是在字符串末尾加的,便于处理
{
if (tmp=="")//如果分隔符前是非法字符,则报错
{
isUrl = false;
return;
}
result[resL++] = tmp; //否则加入分隔结果中
tmp = "";
}else
{
char c=str[i];
isUrl = false;
return;
}
}
i++;
}
}
void divStrBySTL()//C++11 & STL风格,用lambda表达式实现
{
resL = ;
char s[]; //与str相等的字符数组
int i;
string tmp="";
string tmp2="";
for (i=;i<str.length();i++)
s[i]=str[i];
s[i]='\0';
for_each(s,s+i,[&] (char c){
if ((c<='z' && c>='a')||(c<='Z' && c>='A')||(c<='' && c>='')|| c< || c=='-' || c=='_') //合法字符加入tmp中
{
tmp+=c;
if (tmp2=="." || tmp2=="/" || tmp2=="://" || tmp2=="#" || tmp2=="") //如果合法字符前分隔符非法,则报错
tmp2="";
else
isUrl = false;
}else
{
tmp2+=c;
if (tmp!="") //tmp2为分隔符暂存字符串
{
result[resL++] = tmp;
tmp="";
}
}
});
}
void outputResult()//输出分隔结果
{
if (isUrl)
{
int i;
for (i=;i<resL-;i++)
cout<<result[i]<<',';
cout<<result[i]<<endl;
}else
cout<<"is not a URL"<<endl;
}
private:
string str; //输入字符
bool isUrl; //是否为合法URL
string result[];//存分隔结果
int resL; //结果数组长度
}; int _tmain(int argc, _TCHAR* argv[])
{
string s = "http://msdn.microsoft.com/en-us/library/vstudio/啊哈.aspx";
urlDiv *div = new urlDiv(s);
div->divStr(); //使用c++0x风格分隔
div->outputResult(); //使用c++11 & STL风格分隔
div->divStrBySTL();
div->outputResult();
return ;
}
测试输入的URL为:http://msdn.microsoft.com/en-us/library/vstudio/啊哈.aspx
输出结果如下:
现代程序设计 homework-08的更多相关文章
- 现代程序设计homework——04
题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...
- 软工+C(9): 助教指南,持续更新...
上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...
- 20145219 《Java程序设计》第08周学习总结
20145219 <Java程序设计>第08周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是log ...
- 2016CCPC东北地区大学生程序设计竞赛【01/03/05/06/08】
吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! 04正在酝酿中!!!马上更新!!!!! 01题意:有一个n个点的图,对于任意两个不同的点,他的权值是两个点下标的最小公倍数,求最小生出 ...
- Python Revisited Day 08 (高级程序设计技术)
目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...
- 20145210 《Java程序设计》第08周学习总结
第十四章 NIO与NIO2 14.1 认识NIO •NIO概述 •NIO使用频道来衔接数据结点 •在处理数据时,NIO可以让你设定缓冲区容量 •Channel架构与操作 •isOpen():确认Cha ...
- 团体程序设计天梯赛L2-013 红色警报 2017-03-23 22:08 55人阅读 评论(0) 收藏
L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream
链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...
- C语言作业|08
问题 答案 这个作业的属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/9977 我 ...
- C语言I作业08
C语言I作业08 这个作业属于哪个课程 C语言程序设计ll 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9981 ...
随机推荐
- linux PATH环境变量
$PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接 shell下输出path值: echo $PATH: w ...
- git文件未改动pull的时候提示冲突
今天在mac下使用git工具,出现一个很奇怪的问题. 先声明当前工作目录是干净的,运行 git status 没有任何文件改动,且没有任何需要push的文件. 我执行 git pull 命令,直接提示 ...
- 安卓自动化测试工具MonkeyRunner之使用ID进行参数化,以及List选择某项和弹出框点击确定的写法
一.List选择某项的操作步骤: 1.通过父结点得出列表各子项 2.将选择项的文本与列表中的子项进行比较 3.计算出选择项的坐标位置 截取实例: from com.android.monkeyrunn ...
- Android动画效果translate、scale、alpha、rotate
overridePendingTransition只支持android 2.0以上版本,动画效果在anim目录下的xml文件中定义,在程序中用AnimationUtils.loadAnimation( ...
- 【笨嘴拙舌WINDOWS】编码历史
在介绍历史之前,有必要将一个经常使用的词语"标准"解释一下: " 标准是"为了在一定的范围内获得最佳秩序,经协商一致制定并由公认机构批准,共同使用的和重复使用的 ...
- CSS强制英文换行
1. word-break:break-all;只对英文起作用,以字母作为换行依据 2. word-wrap:break-word; 只对英文起作用,以单词作为换行依据 3. white-space: ...
- Asp.net 后台添加Meta标签方法
Asp.net 后台添加Meta标签方法包括keywords,CSS.JS 下面是从Asp.net 后台添加CSS.JS.Meta标签的写法,我们这里写成函数方便以后使用.如果函数放在页面类中, Pa ...
- 【转】iOS 通过xib自定义UITableViewCell【原创】
原文网址:http://blog.it985.com/9683.html 在使用tableView的时候,如果cell的布局过于复杂,通过代码搭建的话不够直观.并且要不停的调整位置,字体什么的.这时, ...
- 使用solrj操作solr索引库
(solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...
- VS2013密匙
在网上找到的,亲测有用: BWG7X-J98B3-W34RT-33B3R-JVYW9