现在的位置: 首页 > 综合 > 正文

C++ primer 读书笔记(2)

2019年05月18日 ⁄ 综合 ⁄ 共 1337字 ⁄ 字号 评论关闭

         在对string类产生的对象操作是,用到size()方法,还是建议使用string::size_type 类型变量来进行接受,由于string的size方法实际返回值为unsigned类型。所以在定义索引变量的时候,也尽量使用上面的类型变量定义之。

for(string::size_type ix = 0; ix != str.size(); ++ix)
   str[ix] = '*';

        这样就不担心类型转换带来的副作用。
        其实在一般的系统中,string::size_type 和 size_t 是同一种类型,即一种unsigned类型,我们可以直接使用下标对string对象进行操作。
        在我们没有对string对象进行初始化时,编译器自动为我们将实例初始化为空字符串。
        在使用vector 容器时,int类型的容器,若不进行初始化,编译器将为我们初始化每一个变量为0 , 当我们要使用索引时 , 应该这样定义之 :

vector<int>::size_type ix ; //ok
vector::size_type ix ; //error 

        vector 的特性之一就是动态增长。即vector::push_back() 具有常数时间的复杂度。          用下标进行初始赋值是无效的,可能会引发运行是严重错误(这种错误由程序员负责!)。所以,应该使用如下的方法:

for (vector<int>::size_type ix = 0 ; ix != 10 ; ++ix) { 

        cin >> temp ; ivecl.push_back (temp) ;

    } 

        使用vector自带的方法进行动态扩展。
        建议使用迭代器对容器中的元素进行访问。因为可以使用下标访问的容器很少,而且尽管可以,也推荐使用迭代器。
        实际上迭代器就是一个指针, 指向每一个元素,无论什么类型,加一以后移动一个元素的内存字节大小。

 

vector<int> temp(10 , 1) ;  
vector<int>::iterator iter = temp.begin() ;  

//既然是引用,那么值应该是一个地址的,为什么不能直接用cout输出?估计是cout的原因,用printf可以的,

 printf ("Begin = %p \n Begin +1 = %p \n" , iter , iter+1 ) ;  
 cout << sizeof (iter) << endl ;
 printf ("begin = %p value = %d \nbegin+1 = %p value = %d\n" , iter ,*iter , \
iter+1 , *(iter+1)) ;

//输出:
Begin = 0x112e010 Begin+1 = 0x112e014 
8
begin = 0xb15010 value = 1 
begin+1 = 0xb15014 value = 1
///可以看到,这个是指针类型喽, 我是64位操作系统,所以指针是8byte

///大家可以吧int换成double试试, 结果相应的就变了Begin 和 Begin +1 之间就相隔8字节了, 但是指针的sizeof还是8 

        由容器的end方法返回的值不指向实际存在的元素,即最后一个元素的后面一个元素。它只是起一个哨兵的作用,告诉我们对这个容器已经处理完了。

抱歉!评论已关闭.