设为首页 加入收藏

TOP

C++ Primer Plus的若干收获--(三)(一)
2015-07-20 18:06:26 来源: 作者: 【 】 浏览:15
Tags:Primer Plus 若干 收获

有时候怀疑真是怀疑自己走的路到底是不是正确的。作为一个土生土长数学系学生,却对数学毫无兴趣,没事的时候就喜欢躲在图书馆看看有关计算机的书。有时候期末考试时候会挂个一两门的数学专业课,有时候真希望数学课本上这一个个繁琐的证明是用代码写的。自己几乎丢掉了本专业的一切,去全身心投入到计算机这一庞大而繁琐的学问中去。真心不知道2年之后自己毕业,自己的结果究竟是什么样的。自己现在唯一能做而又不让自己后悔的我想就是尽可能的多学两门语言与多看几本计算机上的名著了。有时候真的不确定自己会坚持到什么地步,是一直的走下去,还是。。。哎,先不纠结了,默默的坚持下去吧,坚持自己喜欢的东西。如果自己一直在数学的道路走下去的话,可能会生不如死。。。


3.1 数组的替代品 模板类array

vector类的功能比数组强大,但是付出的代价是效率稍低。如果您需要长度固定的数组,使用数组是最佳的选择,但代价是不那么方便和安全。有鉴于此,C++新增了模板类array。与数组一样array对象的长度也是固定的,也使用栈,而不是自由存储区,因此效率与数组相同

#include
  
   
...
using namespace std;
array
   
    ai; array
    
     ad={1.2,2.1,3.43.4.3}; //推而广之 array
     
      array;
     
    
   
  

3.2 比较数组、vector对象和array对象

下面来看一个简单的示例

#include
  
   
#include
   
     #include
    
      int main() { using namespace std; double a1[4]={1.2,2.4,3.6,4.8}; vector
     
      a2(4); a[0]=1/3; a[1]=2/3; a[3]=3/4' a[4]=4/5; array
      
       a3={3.14,2.72,1.62,1.41}; array
       
        a4; a4=a3;//可以直接复制,区别于数组 cout<<"a1[2]:"<
         
         

首先,注意到无论是数组还是vector对象和array对象,都可以使用标准数组表示法来访问各个元素。其次从地址可知,array对象和数组存储在相同的内存区域(栈)中,而vector则存储在另一个区域中,自由存储区或堆中。第三,注意到可以将array对象赋给另一个array对象;而对于数组,必须逐个复制元素。


3.3 副作用和顺序点

首先副作用指的是计算表达式时对某些东西进行了修改;顺序点是程序执行的一个点,在这里,进去下一步之前将确保对所有的副作用进行评估。在C++中,语句中的分号就是一个顺序点,这意味着程序在处理下一个语句之前,赋值运算符、递增运算符和递减运算符执行的所有修改都必须完成。另外任何完整的表达式末尾都是一个顺序点。什么是一个完整的表达式呢?他是这样的:不是另一个更大表达式的子表达式。下面来通过两个例子来加深一下理解

while(guests++<10)
  cout<
          
           

3.4 递增/递减和指针

当我们同时将*与++同时用于指针时将有这样的疑问:将什么解引用,将什么递增。这取决与优先级和运算符的位置。前缀递增、前缀递减和解除引用运算符的优先级相同。后缀递增与后缀递减的优先级相同,但比前缀运算符的优先级高,这两个运算符从左到右的方式进行结合。

前缀运算符从右向左结合规则意味着*++p的含义如下:先将++应用于pt,然后将*用于被递增后的pt。另一方面,++*p意味着先去得pt指向的值,然后将这个值加一。接下来请看下面的组合(*pt)++。圆括号指出首先对指针解除引用,然后再将这个值递增。最后再看下这个组合,x=*pt++;后缀运算符++的优先级更高,这意味着将运算符用于pt,而不是*pt。

3.5 复合语句(语句块)

语句块就是用一对花括号括起来的一条复合语句,他被视作一条语句,从而满足句法的要求。比如for循环:

for(int i=1;i<=5;i++)
{
   cout<<"Value"<
            
             >number;
   sum+=number;
}
            
复合语句还有一条有趣的性质。如果在语句块中定义一个新的变量,则仅当程序执行该语句块时,该变量才存在。执行完语句块后该变量将被释放。如果在一个语句块中声明一个变量,而在外部语句中也有一个这样的变量,情况将如何呢?在声明位置到内部语句结束的范围内,新变量将隐藏旧变量;然后旧变量再次可见,如下例所示:

#include
            
             
int main()
{
	using namespace std;
	int  x=20;
	{
		cout<
              
              


3.6 C-风格字符串与string类字符串的比较

首先讨论下C-风格字符串。由于C++将C-风格字符串视为地址,因此如果以关系运算符来比较它们将无法得到满意的结果。相反,应使用C-风格字符串库中的strcmp()函数。该函数接受两个字符串地址作为参数,这意味着参数可以是指针、字符串或是数组名。

下面着重介绍一下string类字符串的比较。它的比较比较简单,因为类设计能够让您使用关系运算符进行比较。这之所以可行是因为类函数重载了这些运算符。来看如下例子:

#include
               
                
#include
                
                  int main() { using namespace std; string word="?ate"; for(char ch='a';word!="mate";ch++) { cout<
                 
                  

string类重载运算符!=的方式能够让您在下述条件下使用它:至少有一个操作数为string类对象,另一个操作数可以是string类,也可以是C-风格字符串;string类的设计能够将其作为一个实体,也可以将其作为一个聚合对象,从而用数组的方法来提取其中的字符。 3.7 等待一段时间 :完成延时的循环

有时候延时一段时间很有用。比如,读者可能遇到这样的程序,它在屏幕上显示一条消息,而还没来得及阅读,又出现了其他的内容。C++库中有一个函数有助于完成这样的操作。这个函数名为clock,返回程序开始执行后所用的系统时间。这有两个复杂的问题:clock()返回的不一定是秒;其次该函数的返回类型可能不确定。

为解决这样的问题,在头文件ctime提供了这样的解决方案。首先它定义了一个符号常量--CLOCK PER SEC,该常量等于每秒钟包含系统时间的单位数。因此将系统时间除以这个数可以得到秒数。或者将这个数乘上CLOCK PER SEC,可以得到以系统时间为单位的单位时间。其次,ctime将clock_t作为clock()返回类型的别名。如下程序演示了如何使用clock()函数和ctime头文件来创建延时循环:

#include 
                   
                    
#include 
                    
                      using namespace std; int main() { cout<<"Enter the delay time,in seconds:"; float seconds; cin>>seconds; clock_t delay=seconds*
                     CLOCKS_PER_SEC; cout<<"starting\a\n"; clock_t start=clock(); while(clock()-start
                     
                      

3.8 类型别名

下面简要介绍一下类型别名。C++为类型创建别名有两种方式。

一种是使用预处理器:

#define BYTE char
这样,预处理器将在编译程序编译程序是用char来替换BYTE,从而使BYTE成为char的别名。

第二种方法使用关键字typedef来创建别名,完成上述的代码可以

typedef char BYTE;

typedef typeName aliaName//通用格式
一般情况下最好使用typed
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇codeforces Div.2 B.Suffix Struc.. 下一篇CodeForces 425E Sereja and Sets

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: