vector的用法.docx
- 文档编号:6315902
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:18
- 大小:31.39KB
vector的用法.docx
《vector的用法.docx》由会员分享,可在线阅读,更多相关《vector的用法.docx(18页珍藏版)》请在冰豆网上搜索。
vector的用法
前几天一个同学问我c++里面的vector的使用,我研究了一下,先总结如下:
1.vector的数据的存入和输出:
#include
#include
#include
usingnamespacestd;
voidmain()
{
inti=0;
vector
for(i=0;i<10;i++)
{
v.push_back(i);//把元素一个一个存入到vector中
}
for(i=0;i { cout< } cont< } 注: 你也可以用v.begin()和v.end()来得到vector开始的和结束的元素地址的指针位置。 你也可以这样做: vector : iteratoriter; for(iter=v.begin();iter! =v.end();iter++) { cout<<*iter< } 2.对于二维vector的定义。 1)定义一个10个vector元素,并对每个vector符值1-10。 #include #include #include usingnamespacestd; voidmain() { inti=0,j=0; //定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。 所以每一行的长度是可以变化的。 之所以用到vector vector for(j=0;j<10;j++) { for(i=0;i<9;i++) { Array[j].push_back(i); } } for(j=0;j<10;j++) { for(i=0;i { cout< } cout< } } 2)定义一个行列都是变化的数组。 #include #include #include usingnamespacestd; voidmain() { inti=0,j=0; vector vector for(j=0;j<10;j++) { Array.push_back(line);//要对每一个vector初始化,否则不能存入元素。 for(i=0;i<9;i++) { Array[j].push_back(i); } } for(j=0;j<10;j++) { for(i=0;i { cout< } cout< } } 上面就是我对vector使用的总结,更深入的使用,大家查查vector的手册吧。 欢迎批评指正。 介绍std: : vector,并且讨论它在STL中的算法和条件函数remove_if()。 DownloadConsoleDemo-6.19Kb DownloadMFCDemo-14.6Kb 介绍 这篇文章的目的是为了介绍std: : vector,如何恰当地使用它们的成员函数等操作。 本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。 通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了。 Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 为了可以使用vector,必须在你的头文件中包含下面的代码: #include vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: usingstd: : vector; vector 或者连在一起,使用全名: std: : vector 建议使用全局的命名域方式: usingnamespacestd; 在后面的操作中全局的命名域方式会造成一些问题。 vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。 Vector成员函数 函数 表述 c.assign(beg,end) c.assign(n,elem) 将[beg;end)区间中的数据赋值给c。 将n个elem的拷贝赋值给c。 c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 c.back() 传回最后一个数据,不检查这个数据是否存在。 c.begin() 传回迭代器重的可一个数据。 c.capacity() 返回容器中数据个数。 c.clear() 移除容器中所有数据。 c.empty() 判断容器是否为空。 c.end() 指向迭代器中的最后一个数据地址。 c.erase(pos) c.erase(beg,end) 删除pos位置的数据,传回下一个数据的位置。 删除[beg,end)区间的数据,传回下一个数据的位置。 c.front() 传回地一个数据。 get_allocator 使用构造函数返回一个拷贝。 c.insert(pos,elem) c.insert(pos,n,elem) c.insert(pos,beg,end) 在pos位置插入一个elem拷贝,传回新数据位置。 在pos位置插入n个elem数据。 无返回值。 在pos位置插入在[beg,end)区间的数据。 无返回值。 c.max_size() 返回容器中最大数据的数量。 c.pop_back() 删除最后一个数据。 c.push_back(elem) 在尾部加入一个数据。 c.rbegin() 传回一个逆向队列的第一个数据。 c.rend() 传回一个逆向队列的最后一个数据的下一个位置。 c.resize(num) 重新指定队列的长度。 c.reserve() 保留适当的容量。 c.size() 返回容器中实际数据的个数。 c1.swap(c2) swap(c1,c2) 将c1和c2元素互换。 同上操作。 vector vector vector vector vector c.~vector 创建一个空的vector。 复制一个vector。 创建一个vector,含有n个数据,数据均已缺省构造产生。 创建一个含有n个elem拷贝的vector。 创建一个以[beg;end)区间的vector。 销毁所有数据,释放内存。 Vector操作 函数 描述 operator[] 返回容器中指定位置的一个引用。 创建一个vector vector容器提供了多种创建方法,下面介绍几种常用的。 创建一个Widget类型的空的vector对象: vector //------ //| //|-Sincevectorisacontainer,itsmemberfunctions //operateoniteratorsandthecontaineritselfso //itcanholdobjectsofanytype. 创建一个包含500个Widget类型数据的vector: vector 创建一个包含500个Widget类型数据的vector,并且都初始化为0: vector 创建一个Widget的拷贝: vector 向vector添加一个数据 vector添加数据的缺省方法是push_back()。 push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。 例如: 向vector for(inti=0;i<10;i++) vWidgets.push_back(Widget(i)); 获取vector中制定位置的数据 很多时候我们不必要知道vector里面有多少数据,vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。 如果你想知道vector存放了多少数据,你可以使用empty()。 获取vector的大小,可以使用size()。 例如,如果你想获取一个vectorv的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为-1,你可以使用下面的代码实现: intnSize=v.empty()? -1: static_cast 访问vector中的数据 使用两种方法来访问vector。 1、 vector: : at() 2、 vector: : operator[] operator[]主要是为了与C语言进行兼容。 它可以像C语言数组一样操作。 但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。 由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下: 分析下面的代码: vector v.reserve(10); for(inti=0;i<7;i++) v.push_back(i); try { intiVal1=v[7];//notboundschecked-willnotthrow intiVal2=v.at(7);//boundschecked-willthrowifoutofrange } catch(constexception&e) { cout< } 我们使用reserve()分配了10个int型的空间,但并不没有初始化。 如下图所示: 你可以在这个代码中尝试不同条件,观察它的结果,但是无论何时使用at(),都是正确的。 删除vector中的数据 vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当你删除数据的时候,你应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。 在考虑删除等操作之前让我们静下来考虑一下在STL中的一些应用。 Remove_if()算法 现在我们考虑操作里面的数据。 如果要使用remove_if(),我们需要在头文件中包含如下代码: : #include Remove_if()有三个参数: 1、 iterator_First: 指向第一个数据的迭代指针。 2、 iterator_Last: 指向最后一个数据的迭代指针。 3、 predicate_Pred: 一个可以对迭代操作的条件函数。 C++Primer学习笔记——$4vector类、迭代器、bitset类 题记: 本系列学习笔记(C++Primer学习笔记)主要目的是讨论一些容易被大家忽略或者容易形成错误认识的内容。 只适合于有了一定的C++基础的读者(至少学完一本C++教程)。 作者: tyc611,2007-01-15 本文主要讨论C++标准库中vector类、迭代器、bitset类的使用。 如果文中有错误或遗漏之处,敬请指出,谢谢! vector容器类型 vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)。 vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。 与对string类对象的介绍一样,仍然使用简化原型(主要是抛弃了分配器模板参数,使用默认的)。 vector的构造 函数原型: template explicitvector(); //默认构造函数,vector对象为空 explicitvector(size_typen,constT&v=T()); //创建有n个元素的vector对象 vector(constvector&x); vector(const_iteratorfirst,const_iteratorlast); 注: vector容器内存放的所有对象都是经过初始化的。 如果没有指定存储对象的初始值,那么对于内置类型将用0初始化,对于类类型将调用其默认构造函数进行初始化(如果有其它构造函数而没有默认构造函数,那么此时必须提供元素初始值才能放入容器中)。 举例: vector vector vector vector vector的操作(下面的函数都是成员函数) boolempty()const; //如果为容器为空,返回true;否则返回false size_typemax_size()const; //返回容器能容纳的最大元素个数 size_typesize()const; //返回容器中元素个数 size_typecapacity()const; //容器能够存储的元素个数,有: capacity()>=size() voidreserve(size_typen); //确保capacity()>=n voidresize(size_typen,Tx=T()); //确保返回后,有: size()==n;如果之前size() referencefront(); //返回容器中第一个元素的引用(容器必须非空) const_referencefront()const; referenceback(); //返回容器中最后一个元素的引用(容器必须非空) const_referenceback()const; referenceoperator[](size_typepos); //返回下标为pos的元素的引用(下标从0开始;如果下标不正确,则属于未定义行为。 const_referenceoperator[](size_typepos)const; referenceat(size_typepos); //返回下标为pos的元素的引用;如果下标不正确,则抛出异常out_of_range const_referenceat(size_typepos)const; voidpush_back(constT&x); //向容器末尾添加一个元素 voidpop_back(); //弹出容器中最后一个元素(容器必须非空) //注: 下面的插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效 iteratorinsert(iteratorit,constT&x=T()); //在插入点元素之前插入元素(或者说在插入点插入元素) voidinsert(iteratorit,size_typen,constT&x); //注意迭代器可能不再有效(可能重新分配空间) voidinsert(iteratorit,const_iteratorfirst,const_iteratorlast); iteratorerase(iteratorit); //删除指定元素,并返回删除元素后一个元素的位置(如果无元素,返回end()) iteratorerase(iteratorfirst,iteratorlast);//注意: 删除元素后,删除点之后的元素对应的迭代器不再有效。 voidclear()const; //清空容器,相当于调用erase(begin(),end()) voidassign(size_typen,constT&x=T()); //赋值,用指定元素序列替换容器内所有元素 voidassign(const_iteratorfirst,const_iteratorlast); const_iteratorbegin()const; //迭代序列 iteratorbegin(); const_iteratorend()const; iteratorend(); const_reverse_iteratorrbegin()const; reverse_iteratorrbegin(); const_reverse_iteratorrend()const; reverse_iteratorrend(); vector对象的比较(非成员函数) 针对vector对象的比较有六个比较运算符: operator==、operator! =、operator<、operator<=、operator>、operator>=。 其中,对于operator==和operator! =,如果vector对象拥有相同的元素个数,并且对应位置的元素全部相等,则两个vector对象相等;否则不等。 对于operator<、operator<=、operator>、operator>=,采用字典排序策略比较。 注: 其实只需要实现operator==和operator! =就可以了,其它可以根据这两个实现。 因为,operator! =(lhs,rhs)就是! (lhs==rhs),operator<=(lhs,rhs)就是! (rhs (lhs,rhs)。 vector类的迭代器 vector类的迭代器除了支持通用的前缀自增运算符外,还支持算术运算: it+n、it-n、it2-it1。 注意it2-it1返回值为difference_type(signed类型)。 注意,任何改变容器大小的操作都可能造成以前的迭代器失效。 应用示例 #include #include #include usingnamespacestd; intmain() { vector vector assert(v==v2); cout<<">Beforeoperation"< for(vector : const_iteratorit=v.begin();it cout<<*it< v.insert(v.begin()+3,4,"hello,world"); cout<<">Afterinsert"< for(vector : size_typei=0;i cout< vector : iteratorit=v.erase(v.begin()+3,v.begin()+6); assert(*it=="hello,world"); cout<<">Aftererase"< for(vector : size_typei=0;i! =v.size();++i) cout< assert(v.begin()+v.size()==v.end()); assert(v.end()-v.size()==v.begin());
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vector 用法