C++重要知识点总结.docx_第1页
C++重要知识点总结.docx_第2页
C++重要知识点总结.docx_第3页
C++重要知识点总结.docx_第4页
C++重要知识点总结.docx_第5页
免费预览已结束,剩余179页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+重要知识点总结wulimingwuliming_wuliming_QQ:443849922011.01参考书/reference/目 录参考书2目 录3引用与指针的比较11引用的基本概念11引用的规则11STL三大关键组件13STL容器15pair类型15deque17list18set、multiset18map、multimap18hashtableSTL源码剖析19hash_set19hash_map19hash_multiset19hash_multimap19STL迭代器20迭代器的基本概念20容器的iterator类型20迭代器的范围20begin和end操作20使迭代器失效的容器操作21迭代器的自增和解引用运算21迭代器的算数运算21迭代器const_iterator22插入迭代器22iostream迭代器(暂时略过)23反向迭代器23STL仿函数(函数对象)24STL算法25BITSET类型26bitset的定义和初始化26用unsigned值初始化bitset对象26用string对象初始化bitset对象26bitset对象上的操作27测试整个bitset对象27对整个bitset对象进行设置27输出二进制位28标准库STRING类型29string的设计思想29string对象的定义和初始化29getline函数29string的size、length和empty操作29string:size_type类型30strings和c-strings30将string置空30substr()获取子字符串30string的查找函数31标准库VECTOR类型32vector对象的定义和初始化32vector的赋值操作32vector中元素的存取32迭代器相关函数33vector对象的操作33vector容器的自增长34避免重新分配内存的方法34insert和remove元素35函数概念详解36函数的基本概念详解36透彻了解内联函数的里里外外EFFECTIVE C+第三版条款3037传递指向指针的引用37重载函数39重载与作用域39重载和const形参39基于const的重载39成员函数与作用域、函数重载40避免遮掩继承而来的名称Effective C+第三版条款3340THIS指针41this指针的基本概念41this指针的使用41this指针的类型42指向函数的指针42指向函数的指针的类型43初始化和赋值43调用44函数指针的数组45参数和返回类型46考虑写出一个不抛出异常的SWAP函数EFFECTIVE C+条款2548成员初始化表50构造函数54构造函数初始化列表54默认构造函数54单实参构造函数相关的隐式类型转换54派生类构造函数54缺省构造函数深度探索C+对象模型56带有Default Constructor的Member class object56带有Default Constructor的Base class57带有一个虚函数的class57带有一个虚基类的class58总结59复制构造函数61复制构造函数的基本概念61合成的复制构造函数61定义自己的复制构造函数61禁止复制61派生类复制构造函数62复制对象时不要忘记需要复制的每一个成分Effective C+第三版条款1262复制构造函数深度探索C+对象模型63Default Memberwise Initialization63Bitwise Copy Semantics(位逐次拷贝)64不要Bitwise Copy Semantics!65重新设定虚表的指针65处理Virtual Base Class Subobject66赋值操作符69赋值操作符的基本概念69派生类赋值操作符69令赋值操作符返回一个reference to *thisEffective C+第三版条款1069在赋值操作符中处理自我赋值Effective C+第三版条款1170赋值操作符的注意事项Effective C+第三版条款0670析构函数72析构函数的基本概念72派生类析构函数72虚析构函数72不要在构造函数和析构函数中调用虚函数Effective C+条款0973别让异常逃离析构函数Effective C+第三版条款0774STATIC类成员75定义static成员75使用类的static成员75static数据成员76static成员函数77友元的基本概念79普通友元函数79友元成员函数79友元类79注意事项80操作符重载81重载操作符的定义81输出操作符重载82相等操作符83关系操作符83赋值操作符、复合赋值操作符84下标操作符84成员访问操作符85自增自减操作符85函数调用操作符重载87类类型和其它类型之间的相互转换88到类类型的隐式转换88从类类型到其它类型的转换89公有、私有和受保护继承90基本概念90接口继承和实现继承91默认继承保护级别91友元与继承的关系91继承与静态成员91虚函数93派生类和虚函数93virtual与动态绑定93虚析构函数93构造函数和赋值操作符不要设置为虚函数94构造函数和析构函数中的虚函数94纯虚函数94多重继承96多重继承的派生类从每个基类中继承状态96同名成员函数的二义性97转换与多个基类97多重继承下的虚函数98多重继承派生类的复制控制99明智而谨慎地使用多重继承Effective C+第三版条款40100虚拟继承101基本概念101虚拟基类声明102虚基类成员的可见性104特殊的初始化语义105如何构造虚继承的对象106构造函数与析构函数顺序106嵌套类108局部类117RTTI 运行时类型识别119基本概念119dynamic_cast 操作符119typeid 操作符122type_info 类123命名的强制类型转换126const_cast126static_cast126dynamic_cast126reinterpret_cast127尽量少做转型动作Effective C+第三版条款27127C+中对象的大小深度探索C+对象模型128数据成员的布局深度探索C+对象模型133静态数据成员的存取134非静态数据成员的存取134“继承“与数据成员135指向数据成员的指针深度探索C+对象模型143成员函数深度探索C+对象模型146非静态成员函数(Nonstatic Member Functions)146静态成员函数(Static Member Functions)147虚拟成员函数(Virtual Member Functions)148多重继承下的Virtual Functions151虚继承下的Virtual Functions153指向成员函数的指针深度探索C+对象模型154支持“指向virtual member functions”的指针154在多重继承之下,指向Member Functions的指针155智能指针156Google C+编程风格指南关于智能指针的说明156auto_ptr156scoped_ptr157shared_ptr157AUTO_PTR解析158auto_ptr的源代码158构造函数与析构函数160拷贝构造与赋值161提领操作(dereference)162辅助函数162特殊转换163auto_ptr运用实例(STL标准模板库p47)163SCOPED_PTR解析165scoped_ptr的基本概念165scoped_ptr的成员函数165swap函数166scoped_ptr的用法166scoped_ptr 和Pimpl用法168scoped_ptr 不同于 const auto_ptr169总结170scoped_array170SHARED_PTR解析171shared_ptr的基本概念171shared_ptr的成员函数172shared_ptr的用法174回顾Pimpl用法174shared_ptr 与标准库容器175shared_ptr 与其它资源176使用定制删除器的安全性177从this创建shared_ptr178总结179shared_array179C+中资源的管理180以对象管理资源Effective C+第三版条款13180在资源管理类中小心copying行为Effective C+第三版条款14181在资源管理类中提供对原始资源的访问Effective C+第三版条款15181成对使用new和delete时要采取相同的形式Effective C+第三版条款16181以独立语句将newed对象置入智能指针Effective C+第三版条款17182引用与指针的比较引用的基本概念引用只是它绑定的对象的另外一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。以下程序中,n是m的一个引用,m是被引用的对象。Widget m;Widget &n = m;n相当于m的别名(或者绰号),对n的任何操作实际上就是对m的操作。例如有人名叫王二,他的绰号是“小二”。说“小二”怎么怎么的,其实就是对王二说三道四。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。引用的规则引用的一些规则如下:(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)(4)引用的主要功能是传递函数的参数和返回值以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。int i = 5;int j = 6;int &k = i;k = j;/ k和i的值都变成了6;上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C+语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。以下是“值传递”的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。void Func1(int x)x = x + 10;int n = 0;Func1(n);cout “n = ” n endl;/ n = 0以下是“指针传递”的示例程序。由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10。void Func2(int *x)(* x) = (* x) + 10;int n = 0;Func2(&n);cout “n = ” n endl;/ n = 10以下是“引用传递”的示例程序。由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n,所以n的值成为10。void Func3(int &x)x = x + 10;int n = 0;Func3(n);cout “n = ” n endl;/ n = 10对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?答案是“用适当的工具做恰如其分的工作”。一般而言,当你需要考虑“不指向任何对象”的可能性时,或者是考虑“在不同时间指向不同对象”的能力时,你就应该采用指针。前一种情况可以将指针设置为null,后一种情况可以改变指针所指向的对象。而当你确定“总是会代表某个对象”,并且“一旦代表了该对象就不再能够改变”,那么就应该选引用。还有其它情况也需要使用引用,比如当你实现某些操作符的时候。最常见的例子就是operator。这个操作符很特别地必须返回某种能够被当做赋值对象的东西:vector v(10);v5 = 10;如果operator返回的是指针,上述最后一个语句就必须写成这样子:*v5 = 10;这不是取下标操作符的自然直观的使用方式,所以,取下标操作符最好返回对象的引用。备注:另外可以参考More Effective C+条款1STL三大关键组件STL(标准模板库)是C+标准程序库的核心,它深刻影响了标准程序库的整体结构。STL是一个泛型程序库,提供一系列软件方案,利用先进、高效的算法来管理数据。若干精心勾画的组件共同合作,构筑起STL的基础。这些组件当中,最为关键的是容器、迭代器和算法。容器:迭代器:算法:STL数据和操作的分离STL容器注意:本章节只提供容器的一个概要性说明,相关知识点的详细总结,参见指定的材料pair类型C+标准程序库P33C+ PRIMER第四版特别版P306pair对象的基本概念需要注意的是,pair被定义为struct,而不是class,这么一来,所有的成员都是public,我们因此可以直接存取pair中的两个数据成员。与容器一样,pair也是一种模板类型。在创建pair对象时,必须提供两个类型名:pair对象所包含的两个数据成员各自对应的类型名称:pair anon;pair word_count;pair string, vector line;pair对象的操作make_pair操作dequeC+标准程序库P160listC+标准程序库P166set、multisetC+标准程序库P175C+ PRIMER第四版特别版P319set和multiset的底层数据结构通常是红黑树。红黑树在改变元素数量和元素查找方面都很出色,它保证节点安插时最多只会作两个重新连接动作,而且到达某一元素的最长路径深度,最多只是最短路径深度的两倍。自动排序造成set和multiset的一个重要限制,你不能直接改变元素值,因为这样会打乱原本正确的顺序。因此,要改变元素值,必须先删除旧元素,再插入新元素。map、multimapC+标准程序库P194C+ PRIMER第四版特别版P309map和multimap的底层数据结构通常也是红黑树。同样,自动排序这一性质使得map和multimap身上有了一条重要的限制:不可以直接改变元素的key,因为这会破坏正确的排序。要修改元素的key,也必须先移除拥有key的元素,然后插入新的key/value的元素。hashtableSTL源码剖析STL源码剖析P247hash_setSTL源码剖析P270hash_mapSTL源码剖析P275hash_multisetSTL源码剖析P279hash_multimapSTL源码剖析P282STL迭代器迭代器的基本概念迭代器(iterator)是用来遍历容器内所有元素的数据类型。标准库为每一种标准容器定义了一种迭代器类型。迭代器类型提供了比下标操作更通用的方法:所有标准容器类都定义了相应的迭代器类型,而只有少数的容器支持下标操作。在编写C+程序时,用迭代器遍历容器是一种更通用的方法,也更加安全。容器的iterator类型迭代器的范围C+语言使用一对迭代器标记迭代器的范围。这两个迭代器分别指向同一容器中的两个元素或超出末端的下一个位置。通常将它们命名为first和last,或者beg和end,用于标记容器中的一段元素范围。该范围内的元素包括迭代器first指向的元素,以及从first开始一直到迭代器last指向的位置之前的所有元素。此元素范围称为左闭合区间,其标准表示方式为: first, last )表示范围从first开始,到last结束,但是不包括last。使用左闭合区间的编程意义:假设first和last标记了一个有效的迭代器范围,于是(1)、当first与last相等时,迭代器范围为空(2)、当first与last不等时,迭代器范围至少有一个元素,而且first指向该区间的第一个元素。此外,通过first的若干次自增运算,first最终能够到达last,使得first=lastbegin和end操作begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器。这两个迭代器用于标记包含容器内所有元素的迭代器的范围。c.begin()返回一个迭代器,指向容器c的第一个元素c.end()返回一个迭代器,指向容器c的最后一个元素的下一个位置c.rbegin()返回一个逆序迭代器,指向容器c的最后一个元素c.rend()返回一个逆序迭代器,指向容器c的第一个元素前面的位置上述每个操作都有两个不同版本:一个是const成员,另外一个是非const成员。这些操作返回什么类型取决于容器是否为const。如果容器不是const,则这些操作返回iterator或reverse_iterator类型;如果容器是const,则返回类型要加const_前缀,也就是const_iterator和const_reverse_iterator类型。假设已经声明了一个vector类型的ivec变量,要把所有的元素值重新设置为0,我们可以用下标操作和用迭代器操作两种方式来完成:for( vector:size_type ix=0; ix ivec.size(); +ix ) ivecix = 0;for( vector:iterator iter = ivec.begin(); iter != ivec.end(); +iter ) *iter = 0;使迭代器失效的容器操作一些容器操作会修改容器的内在状态或移动容器内的元素。这样的操作使所有指向被移动的元素的迭代器失效,也可能同时使其他迭代器失效。使用无效迭代器是没有定义的,可能会导致与悬垂指针相同的问题。我们无法检测迭代器是否有效,也无法通过测试来发现迭代器是否已经失效。任何无效迭代器的使用都可能导致运行时错误,但程序不一定会崩溃,否则检查这种错误也许会容易一些。迭代器的自增和解引用运算迭代器的算数运算迭代器const_iterator插入迭代器iostream迭代器(暂时略过)反向迭代器STL仿函数(函数对象)C+标准程序库P124C+标准程序库P293STL源码剖析P413仿函数的具体概念详解,参照C+标准程序库对应的章节,下面仅仅罗列仿函数相对于普通函数所具备的优点:STL算法C+标准程序库P321434STL源码剖析P285关于各种算法的详细解释,参照上面的这两本书的对应章节bitset类型有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使用bitset类就必须要包含相关的头文件。在本书提供的例子中,假设都使用了std:bitset的using声明:#include using std:bitset;bitset的定义和初始化下表列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:bitset bitvec; /32位,全为0。这条语句把bitvec定义为含有32个位的bitset对象。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。用unsigned值初始化bitset对象当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。而bitset对象中的位集作为这种位模式的副本。如果bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位置为0;如果bitet类型长度小于unsigned long值的二进制位数,则只使用unsignedlong值中的低阶位,超过bitet类型长度的高阶位将被丢弃。在32位unsigned long的机器上,十六进制值0xffff表示为二进制位就是十六个1和十六个0(每个0xf可表示为1111)。可以用0xffff初始化bitset对象:/ bitvec1 is smaller than the initializerbitset bitvec1(0xffff); / bits 0 . 15 are set to 1/ bitvec2 same size as initializerbitset bitvec2(0xffff); / bits 0 . 15 are set to 1; 16 . 31 are 0/ on a 32-bit machine, bits 0 to 31 initialized from 0xffffbitset bitvec3(0xffff); / bits 32 through 127 initialized to zero用string对象初始化bitset对象当用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右向左:string strval(1100);bitset bitvec4(strval);bitvec4的位模式中第2和3的位置为1,其余位置都为0。如果string对象的字符个数小于bitset类型的长度,则高阶位将置为0。不一定要把整个string对象都作为bitset对象的初始值。相反,可以只用某个子串作为初始值:string str(1111111000000011001101);bitset bitvec5(str, 5, 4); / 4 bits starting at str5, 1100bitset bitvec6(str, str.size() - 4); / use last 4 charactersbitset对象上的操作测试整个bitset对象如果bitset对象中有一个或多个二进制位置为1,则any操作返回true,也就是说,其返回值等于1;相反,如果bitset对象中的二进制位全为0,则none操作返回true。bitset bitvec; / 32 bits, all zerobool is_set = bitvec.any(); / false, all bits are zerobool is_not_set = bitvec.none(); / true, all bits are zero如果需要知道置为1的二进制位的个数,可以使用count操作,该操作返回置为1的二进制位的个数:size_t bits_set = bitvec.count(); 与vector和string中的size操作一样,bitset的size操作返回bitset对象中二进制位的个数,返回值的类型是size_t:size_t sz = bitvec.size(); / returns 32对整个bitset对象进行设置set和reset操作分别用来对整个bitset对象的所有二进制位全置1和全置0:bitvec.reset(); / set all the bits to 0.bitvec.set(); / set all the bits to 1flip操作可以对bitset对象的所有位或个别位按位取反:bitvec.flip(0); / reverses value of first bitbitvec0.flip(); / also reverses the first bitbitvec.flip(); / reverses value of all bits输出二进制位可以用输出操作符输出bitset对象中的位模式:bitset bitvec2(0xffff); / bits 0 . 15 are set to 1; 16 . 31 are 0cout bitvec2: bitvec2 endl;输出结果为:bitvec2: 00000000000000001111111111111111参考资料:C+ PRIMER(第4版特别版)P8892标准库string类型string的设计思想C+标准库中的string class使你可以将string当做一个一般类型而不会令用户感觉有任何问题。你可以像对待基本类型那样地复制、赋值和比较string,再也不必担心内存是否足够、占用的内存的实际长度等问题。C+标准库对string的设计思维就是:让它的行为尽可能像基本类型,不会在操作上引起什么麻烦(至少原则如此)。头文件包含#include using std:string;string对象的定义和初始化string s1;默认构造函数,s1为空串string s2(s1);将s2初始化为s1的一个副本string s3(“value”);将s3初始化为一个字符串字面值的副本string s4(n,c);将s4初始化为字符c的n个副本getline函数getline函数接受两个参数:一个输入流对象和一个string对象。getline从输入流的下一行读取,并保存读取的内容到string中,但是不包括换行符。getline将istream参数作为返回值:int main()string line;while(getline(cin,line) coutlineendl;return 0;string的size、length和empty操作string对象的长度指的是string对象中字符的个数,可以通过size操作符获取,也可以通过length()来获取,这两个函数等效。string的empty()成员函数用来判断字符串是否为空,如果字符串为空,则返回true,否则返回false:int main()string st(“this is a example”);if(st.empty() cout”this is a empty string.”;elsecout”the size of ”st” is ”st.size()endl;return 0;string:size_type类型size操作符返回的是string:size_type类型的值,它保证可以存储任意string对象的长度。为了使用由string类型定义的size_type类型,必须加上作用域操作符来说明所使用的size_type类型是由string类定义的。strings和c-strings有三个函数可以将字符串内容转换为字符数组或c-string:data()以字符数组的形式返回字符串内容。由于并未追加0字符,所以返回类型并非有效的c-stringc_str()以c-string形式返回字符串内容,也就是在尾端添加0字符copy()将字符串内容复制到“调用者提供的字符数组“中。不添加0字符请注意:0在string之中并不具有特殊意义,0和其它字符的地位完全相同,但是在c-string中却用来标识字符串的结束。还要注意的是,data() 和 c_str()返回的字符数组由该字符串拥有,调用者千万不可修改它或者释放其内存。下面是相关的一些例子:std:string s(“12345”);atoi(s.c_str();f(s.data(), s.length();char buffer100;s.copy( buffer, 100 );一般而言,在整个程序中应该坚持使用string,直到必须将其转换为char*类型时才把它们转换为c-string。将string置空有许多动作都可以将字符串设置为空字符串,例如:std:string s=”this is a example”;s = “”;s.clear();s.erase();substr()获取子字符串std:string s(“interchangeability”);s.substr()/返回整个s字符串s.substr(11)/返回“ability“s.substr(5,6)/返回“change“s.substr(s.find(c)/返回“changeability“string的查找函数string提供了很多用于搜索和查找字符以及子字符串的函数。如果配上迭代器,STL的所有搜索算法都可以派上用场。所有搜索函数的名字中都有find这个词:find()搜索第一个与value相等的字符rfind()搜索最后一个与value相等的字符find_first_of()搜索第一个“与value中的某值相等“的字符find_last_of()搜索最后一个“与value中的某值相等“的字符find_first_not_of()搜索第一个“与value中的任何值都不相等“的字符find_last_not_of()搜索最后一个“与value中的任何值都不相等“的字符所有搜索函数都返回符合搜索条件的字符区间内的第一个字符的索引。如果搜索不成功,则返回string:npos。这些搜索函数都采用下面的参数方案:第一个参数总是被搜索的对象第二个参数(可有可无)指出string内的搜索起点第三个参数(可有可无)指出搜索的字符个数例子:std:string s(“Hi Bill, Im ill, so please pay the bill”);s.find(“il”)/返回4s.find(“il”, 10)/返回13s.rfind(“il”)/返回37s.find_first_of(“il”)/返回1(第一个为i或者l的字符)s.find_last_of(“il”)/返回39s.find_first_not_of(“il”)/返回0s.find_last_not_of(“il”)/返回36s.find(“hi”)/返回string:npos参考资料:C+ PRIMERP7078、C+ PRIMERP289299C+标准程序库自修教程与参考手册P471528标准库vector类型在出现标准库之前,C+程序大量使用数组保存一组对象。而现代的C+程序则更多地使用vector来取代数组。数组被严格限制于程序内部使用,只有当性能测试表明使用vector无法达到必要的速度要求时,才使用数组。vector支持随机存取,vector的迭代器是随机存取迭代器。在vector的末端添加或者删除元素时,vector的性能相当好。可是如果你在vector的前面或者中间部位插入或者删除元素,性能就不怎么样了,因为操作点之后的每一个元素都需要移动位置。使用vector之前,必须包含相应的头文件:#include using std:vector;vector是一个类模板,我们可以定义保存string对象的vector,或者保存int值的vector,甚至可以定义保存自定义的类类型对象的vector。vector ivec;vector sales_vec;vector不是一种数据类型,而只是一个类模板,可以用来定义任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。比如上面定义的vector和vector都是数据类型。vector对象的定义和初始化vector定义了好几种构造函数,用来定义和初始化vector对象:vector v1vector保存类型为T的对象vector v2(v1)v2是v1的一个副本vector v3(n, elem)v2包含n个值为elem的元素vector v4(n)v4含有值初始化的元素的n个副本vector v5(first,last)v5以first,last)迭代器所指区间的元素作为初值vector的赋值操作v1 = v2将v2的全部元素赋值给v1v1.assign(n,elem)复制n个elem,赋值给v1v1.assign(first,last)将迭代器所指区间first,last)的元素赋值给v1v1.swap(v2)将v1和v2交换swap(v1,v2)同上,此为全局函数vector中元素的存取v.at(idx)返回idx所标示的元素,如果idx越界,抛出out_of_range异常vidx返回idx所标示的元素,不进行范围检查v.front()返回第一个元素,不检查第一个元素是否存在v.back()返回最后一个元素,不检查最后一个元素是否存在调用operator时,必须确保索引有效;调用front()或back()时必须确保容器不空,例如:std:vector ivec;/emptyif(ivec.size() 5)ivec5 = 100;/okif( !ivec.empty() )coutivec.front();/okivec.at(5) = 100;/抛出out_of_range异常迭代器相关函数vector的迭代器是随机存取迭代器,从理论上讲,可以通过这个迭代器操作所有是STL算法。vector迭代器相关函数如下:v.begin()返回一个随机存取迭代器,指向第一个元素v.end()返回一个随机存取迭代器,指向最后元素的下一个位置v.rbegin()返回一个逆向迭代器,指向逆向迭代器的第一个元素v.rend()返回一个逆向迭代器,指向理想迭代器最后一个元素的下一个位置vector迭代器持续有效,除非发生两种情况:使用者在一个较小索引位置上安插或移除元素;由于容量变化而引起的内存重新分配。vector对象的操作v.empty()如果v为空,返回true,否则返回falsev.size()返回v中元素的个数v.max_size()返回可容纳的元素最大数量v.capacity()返回重新分配空间前所能容纳的元素最大数量v.push_back(t)在v的末尾增加一个值为t的元素vn返回v中位置为n的元素v1 = v2把v1的元素替换为v2中元素的副本v1 = v2如果v1和v2相等,返回true!=,=保持这些操作符的惯有含义empty和size操作类似于string类型的相关操作。成员函数size返回相应vector类定义的size_type的值。使用size_type类型时,必须指出该类型是在哪里定义的。vector类型总是应该包括vector的元素类型:vector:size_type /okvector:size_type/errorpush_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面:string word;vector text;while(cinword) text.push_back(word);vector中的对象是没有命名的,可以按vector中对象的位置来访问它们。通常使用下标操作符来提取元素(下标操作只能用来获取向量中已经存在的元素):for(vector:size_type ix=0; ix ivec.size(); +ix) ivecix = 0;/for循环将ivec向量中的元素都设置为0vector容器的自增长为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些。vector容器预留了这些额外的存储区,用于存放新添加的元素。于是,不必每次添加元素的时候都需要重新分配空间。vector所分配的额外内存容量的确切数目因库的实现不同而不同。vector类提供两个成员函数:capacity和reserve,使程序员可与vector容器内存分配的实现部分交互工作。capacity操作获取在容器需要分配更多的存储空间之前能够存储的元素总数,而reserve操作则告诉vector容器应该预留多少个元素的存储空间。弄清楚容器的capacity和size的区别非常重要。size指容器当前拥有的元素个数;而capacity则指容器在必须分配新存储空间之前可以存储的元素的总数。下面是一个相关的例子:vector ivec;cout”ivec: size: ” ivec.size() “ capacity: ” ivec.capacity() endl;for( vector:size_type ix=0; ix != 24; +ix ) ivec.push_back(ix);cout”ivec: size: ” ivec.size() “ capacity: ” ivec.capacity() endl;得到的输出结果为:ivec: size: 0 capa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论