现代程序设计 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的更多相关文章

  1. 现代程序设计homework——04

    题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...

  2. 软工+C(9): 助教指南,持续更新...

    上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...

  3. 20145219 《Java程序设计》第08周学习总结

    20145219 <Java程序设计>第08周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是log ...

  4. 2016CCPC东北地区大学生程序设计竞赛【01/03/05/06/08】

    吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! 04正在酝酿中!!!马上更新!!!!!  01题意:有一个n个点的图,对于任意两个不同的点,他的权值是两个点下标的最小公倍数,求最小生出 ...

  5. Python Revisited Day 08 (高级程序设计技术)

    目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...

  6. 20145210 《Java程序设计》第08周学习总结

    第十四章 NIO与NIO2 14.1 认识NIO •NIO概述 •NIO使用频道来衔接数据结点 •在处理数据时,NIO可以让你设定缓冲区容量 •Channel架构与操作 •isOpen():确认Cha ...

  7. 团体程序设计天梯赛L2-013 红色警报 2017-03-23 22:08 55人阅读 评论(0) 收藏

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  8. 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream

    链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...

  9. C语言作业|08

    问题 答案 这个作业的属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/9977 我 ...

  10. C语言I作业08

    C语言I作业08 这个作业属于哪个课程 C语言程序设计ll 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9981 ...

随机推荐

  1. 富有魅力的git stash

    git stash 会把当前的改动暂时搁置起来, 也就是所谓的git 暂存区. 你可以执行 git stash list 来查看你所有暂存的东东. 也可以 git stash apple ** 来拿下 ...

  2. VC 6.0 LNK2005 错误 处理

    造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量.可能存在两种情况: A.对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是 ...

  3. IIS 无法打开页面,只能重启的问题

    最终解决方案: 要变通解决此问题,启用 EnableAggressiveMemoryUsage 注册表项在注册表中.当启用了 EnableAggressiveMemoryUsage 注册表项 Http ...

  4. Log4j具体使用实例

    首先,下载log4j.jar架包(网上很多,随便下载一个就可以了), 第一步:新建java项目,Testlog4j,再在src中建立com.Testlog4j包,再建一个testlog4j.java文 ...

  5. JAVA中,不同工程间的方法调用

    可以调用, 用配置构建路径的方法:点选工程1, 点击右键, 选择 Build Path(构建路径) - > Configure Build Path...(配置构建路径...)然后在弹出的窗口中 ...

  6. yeoman开始项目

    使用 yeoman 构建项目之前,你需要安装这两个环境:node,ruby. 为什么需要使用node?因为我们需要使用grunt自动化工具,而grunt工具则是依赖node. 为什么需要使用ruby? ...

  7. poj 3790 Recursively Palindromic Partitions (递推)

    题目 题意:求输入的数字的递归回文. 思路:答案等于这个数字一半之前的所有的 之和. #include <iostream> #include <cstdio> #includ ...

  8. eval绑定decimal数据后,如何去掉后面没有意义的0?

    假如有个数字是 25.00 就应该只显示 25   ,而如果是25.3 则还是显示 25.3   Score.ToString("g0")  这样就可以去掉 decimal 后面多 ...

  9. CURL使用2

    一:LibCurl 编程流程1.调用curl_global_init()初始化libcurl2.调用 curl_easy_init()函数得到 easy interface型指针3.调用curl_ea ...

  10. HDU 1041 Computer Transformation

    这道题目的意思是:一开始有一个数字 1 ,在接下来的时间中,计算机会按照如下规则进行扩展:                0 –> 1 0                1 –> 0 1 ...