C++primer(第五版)第三章中标准库类型Vector、迭代器和数组

来源:互联网 发布:java自带线程池实例 编辑:程序博客网 时间:2024/04/28 10:33

标准库类型vector:

     引用vector,则首先需要引进它的头文件#include<vector>,作用:它类似与一个动态数组;

         用法的例子:

          vector<T> v1;   //v1是空vector,元素类型为T(int,string,vector等类型)

          vector<T> v2(n,val);  //v2中有n个重复的元素,每个元素的值为val;

          vector<T> v3{a,b,c,d...}; //v3包含了初始值个数的元素,每个元素被赋予相应的初始值;

       数据例子:目的方便读者更加清晰的理解上面的定义!

          vector<int> v1(10);   // 10个元素,每个都初始化为0;

          vector<int> v2(10,1);   //10个元素,每个的值为1;

          vector<int> v3{10};    //有一个元素,该元素的值为10;

           vector<string> v4(10,"hi");   //有10个元素,每个都初始化为“hi”;

           vector<string> v5{10,"hi"};   //该类与上面的区别:花括号里的值必须与元素类型相同,显然10是int类型,就不能作为元素的初始化值,从而编译器会尝试默认初始化vector对象,从而变成为10个“hi”的元素;(花括号的vector初始化都是C++11特性)

          vector支持的操作:

            vector<T> v;    //定义v为T类型;

            v.empty();   //如果v不含任何元素返回真,否则为假!;

            v.size();         //返回v中元素的个数;

            v.push_back(t);    //向v的尾端添加一个值为t的元素;

            <,<=,>,>= ;     // 以字典顺序进行比较(类似上次笔记string比较);

        下面还需要讲解有关vector的下标操作:(注意与c语言数组运用有点的区别)

             使用下标的时候必须清楚它是否在合理的范围之内(尽可能使用使用for语句)。不能用下标形式去添加元素。(这与c语言的数组添加不同)

        例子:

              vector<int> ivec;  //空vector对象;

              for(decltype(ivec.size()) ix=0;ix!=10;ix++)

              ivec[ix]=ix;      //错误,ivec不包含任何元素;

               cout<<ivec[0];  //该语句也是错误的;

            显然我们知道c语言是可以用下标去执行该功能的;不能的原因:ivec是一个空对象,根本不包含任何元素,当然也就不能通过下标去访问任何元素!正确的方法应该是使用push_back(上面有它的介绍);

           迭代器的简单介绍(后面章节还有大量的有关迭代器问题):

          迭代器提供了对对象的间接访问:迭代器可以访问某个元素,也能从一个元素移到下一个元素。

         begin成员负责返回第一个元素的迭代器,end是返回尾元素的下一个位置的迭代器(一个不存在的“尾后”,特别注意end迭代器由于并不实际指示某个元素,所以不能对其进行递增或解引用的操作)。

            迭代器的运算符号:

             *iter                   返回迭代器iter 所指元素的引用;

             iter->men            解引用iter并获取该元素的名为men的成员,等价于(*iter).men  ;

             vector和string迭代器支持的运算:

             iter+n,iter-n,iter+=n,iter-=n,iter1-iter2,>,>=,<,<=

                很显然迭代器的 这些运算我们都比较熟悉,和c语言数组的下标(指针)类似,就不具体详解;注意一下二分法中迭代器mid=s.begin()+(s.end()-s.begin())/2;我们很清晰的能够感到似曾相识的感觉(c语言指针运算);

             数组:(和c语言数组一样)

              复习复合数组的声明:

               int (*parry)[10]=&arr;   //parry指向一个含有10个整数的数组;

               int (&arrRef)[10]=arr;   //arrRef引用一个含有10个整数的数组;

               int *(&arry)[10]=ptrs;  //arry是数组的引用,该数组含有10 个指针;

              要想数组的声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读。

          数组和c语言中的都类似,不同的是C++中有了begin和end数组指针,也是迭代器;c语言数组用的下标(指针)访问和添加元素;

总结C++11特性:

           1.花括号对vector对象进行初始化;(上面有详细的讲解)

            这里对编译器也有要求需要支持C++11特性的编译器;否则就回编译错误;   vector<string> v1{"a","an","the"};该语句用一般编译器通不过;

            2.cbegin和cend:

             cbegin和cend的类型都是const_iterator,它们与begin和end类似,唯一不同的是不论vector对象(或string对象)本身是否是常量,返回值都是const_iterator.

             const_iterator类型只能读字符(元素),不能写字符(元素);

            3.数组中的begin和end:

            这两个函数与容器中的两个同名成员功能类似,不过数组毕竟不是类类型,因此这两个函数不是成员函数。和c语言数组的下标功能一样;(上面也有提到)

            4.auto和declytype(上一个学习笔记做了详细介绍)

            简单复习一下:auto由后面的计算结果决定声明的类型;declytype(A)B根据A的类型声明成B的类型;

           vector和迭代器后面会有大量章节介绍vector的访问、删除和插入等问题,暂时只是对他们有一个初步的了解;特别注意迭代器中的细节问题,比如begin和end的具体位置指向;

                                  

       




0 0
原创粉丝点击