C++中vector的用法

合集下载

c++vector基本函数、排序、查找用法

c++vector基本函数、排序、查找用法

c++vector基本函数、排序、查找⽤法vector⽤法⽬录:1、基本⽤法:头⽂件:#include<vector>定义vector:整数型: vector<int>a;字符型: vector<char>a;字符串型: vector<string>a; (注意字符串型输⼊输出⽤cin和cout)固定vector的⼤⼩:vector<int>a(105);在容器最后存⼊新元素:for(int i=0;i<10;i++){b.push_back(i);}将字符数组中的数据赋值给容器:1、遍历赋值:char a[MAX+5];vector<char>vc;cin>>a;int la=strlen(a);for(int i=0;i<la;i++)vc.push_back(a[i]);2、定义容器时赋值:char a[MAX+5];cin>>a;int la=strlen(a);vector<char>vc(a,a+la);判断容器的长度:printf("%d\n",b.size());遍历容器中元素:1、遍历输出for(int i=0;i<vc.size();i++)printf("%c",vc[i]);printf("\n");2、错误⽰例:for(int i=vc.begin();i<vc.end();i++){cout<<vc[i]<<" ";}cout<<endl;清空容器、判断是否为空、删除最后元素:清空容器: a.clear();//清空a中的元素判断容器是否空:a.empty();//判断a是否为空,空则返回ture,不空则返回false删除容器最后的元素: a.pop_back(); ///括号内不可以添加index删除指定元素2、vector的删除操作vector很好的⼀点就是可以实现删除操作,⽤它来做模拟很好实现。

c++中vector的用法详解

c++中vector的用法详解

c++中vector的用法详解vector(向量): C++中的一种数据结构,确切的讲是一个类.它相当于一个动态的数组,当程序员无法明白自己需要的数组的规模多大时,用其来解决咨询题能够达到最大节约空间的目的.用法:1.文件包含:首先在程序开头处加上#include以包含所需要的类文件vector还有一定要加上using namespace std;2.变量声明:2.1 例:声明一个int向量以替代一维的数组:vector a;(等于声明了一个int数组a[],大小没有指定,能够动态的向里面添加删除)。

2.2 例:用vector代替二维数组.事实上只要声明一个一维数组向量即可,而一个数组的名字事实上代表的是它的首地址,因此只要声明一个地址的向量即可,即:vector a.同理想用向量代替三维数组也是一样,vector a;再往上面依此类推.3.具体的用法以及函数调用:3.1 如何得到向量中的元素?其用法和数组一样:例如:vector aint b = 5;a.push_back(b);//该函数下面有详解cout c.c.clear()移除容器中所有数据。

c.empty()推断容器是否为空。

c.erase(pos)删除pos位置的数据c.erase(beg,end)删除[beg,end)区间的数据c.front()传回第一个数据。

c.insert(pos,elem)在pos位置插入一个elem拷贝c.pop_back()删除最后一个数据。

c.push_back(elem)在尾部加入一个数据。

c.resize(num)重新设置该容器的大小c.size()回容器中实际数据的个数。

c.begin()返回指向容器第一个元素的迭代器c.end()返回指向容器最后一个元素的迭代器4.内存治理与效率1》使用reserve()函数提早设定容量大小,幸免多次容量扩充操作导致效率低下。

关于STL容器,最令人赞扬的特性之一就是是只要不超过它们的最大大小,它们就能够自动增长到足以容纳你放到里面去的数据。

c++ vector用法

c++ vector用法

c++ vector用法
vector是C++标准模板库定义的一种容器类型,它和数组类似,允许用户储存并随机
访问任意多的元素。

与数组不同的是,vector可以动态的增长和减少控制存储元素的数量。

vector主要由三部分组成:
(1) vector本身,它是一个容器对象,用于存放元素;
(2) 元素类型,vector是一个类模板,它使用用户定义的特定类型元素;
(3) 容器操作,为了实现多态性,vector模板定义了一些接口,操作元素,包括插入元素和查询等。

(1) vector用于储存和操作大量的元素, vector 可以快速的在后面追加元素,不必担心在追加的过程中发生“越界”的问题;
(2) vector 是标准库提供的一个随机访问的容器,也就是说,用户可以直接根据下
标访问 vector 中的任一元素,vector 会自动处理访问越界等异常情况;
(3) vector 可以与迭代器结合使用,使用迭代器可以方便的对 vector 中的元素进
行操作;
(4) vector 还可以方便的查找、替换更新元素,也可以排序、合并元素,可以使用erase() 函数移除元素;
(5) vector 还提供了区间 erase 函数,使用这个函数可以删除某一区间的元素;
总之,vector 是非常实用的一种容器,它可以方便的储存、查找、替换元素,使用
它可以简化很多复杂操作,提高程序开发效率。

c++向量的用法

c++向量的用法

c++向量的用法C++中的向量(Vector)是一种动态数组,它能够自动调整大小以适应不同的元素数量。

向量属于标准模板库(Standard Template Library,STL)的一部分,它提供了许多方便的函数和操作符,用于方便地处理和操作元素。

下面将介绍向量的用法及相关参考内容。

1. 定义和初始化向量向量的定义需要包含<vector>头文件,并使用std命名空间。

我们可以使用以下方式来定义和初始化向量:```cpp#include <vector>#include <iostream>int main() {// 定义一个整数类型的向量std::vector<int> v1;// 定义一个浮点类型的向量,初始容量为10std::vector<float> v2(10);// 定义一个字符串类型的向量,并初始化为{"Hello", "World"}std::vector<std::string> v3{"Hello", "World"};// 定义一个空向量,并指定初始容量为5std::vector<char> v4(5, 'a');// 输出向量中的元素for (int i : v1) {std::cout << i << " ";}std::cout << std::endl;for (float f : v2) {std::cout << f << " ";}std::cout << std::endl;for (std::string str : v3) {std::cout << str << " ";}std::cout << std::endl;for (char c : v4) {std::cout << c << " ";}std::cout << std::endl;return 0;}```参考内容:- 《C++ Primer Plus》- 《C++标准库-深度剖析》,侯捷- 《C++标准库速查表》2. 向向量中添加元素向量提供了几个函数来添加元素:- push_back(value):在向量的末尾添加一个元素;- insert(iterator, value):在指定位置插入一个元素;- emplace(iterator, args...):在指定位置使用参数构造一个元素;- insert(iterator, n, value):在指定位置插入n个元素;- insert(iterator, first, last):在指定位置插入另一个区间内的元素。

C++学习二vector的用法(使用sort对于vector排序)

C++学习二vector的用法(使用sort对于vector排序)

C++学习⼆vector的⽤法(使⽤sort对于vector排序)⼀、vector的介绍vector是C++⾥⾯的⼀个容器,也是我们数学上⾯理解的向量,有⼀些⽐较常见的操作。

⼆、vector的定义#include<vector>using namespace std;//int 说明的是vector存储的数据类型vector<int> odd_vector;三、vector的⼀些操作(具体调⽤⽅式⾃⾏查找)1.push_back 在数组的最后添加⼀个数据2.pop_back 去掉数组的最后⼀个数据3.at 得到编号位置的数据4.begin 得到数组头的指针5.end 得到数组的最后⼀个单元+1的指针6.front 得到数组头的引⽤7.back 得到数组的最后⼀个单元的引⽤8.max_size 得到vector最⼤可以是多⼤9.capacity 当前vector分配的⼤⼩10.size 当前使⽤数据的⼤⼩11.resize 改变当前使⽤数据的⼤⼩,如果它⽐当前使⽤的⼤,者填充默认值12.reserve 改变当前vecotr所分配空间的⼤⼩13.erase 删除指针指向的数据项14.clear 清空当前的vector15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)17.empty 判断vector是否为空(vector.empty())18.swap 与另⼀个vector交换数据三、使⽤sort对于vector分类⽤法:#inlcude <algorithm>sort(vector.begin(),vector.end());例⼦如下:#include <algorithm> //使⽤sort需要包含这个头⽂件//这个⽅法的主要的作⽤是把⼀个向量⾥⾯的奇数找出来放到原来的位置class Kata{public:std::vector<int> sortArray(std::vector<int> array){if(array.empty())return array;std::vector<int> odd_vector;for(int i=0;i<array.size();i++){if(array[i]%2==1){odd_vector.push_back(array[i]);}}if(odd_vector.size()>0){//sort对于vector向量的排序,升序排列sort(odd_vector.begin(),odd_vector.end());int number=0;for(int i=0;i<array.size();i++){if(array[i]%2==1){array[i]=odd_vector[number];number++;}}}return array;}};。

c++中vector的用法详解

c++中vector的用法详解

c++中vector的用法详解c++中vector的用法详解vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.用法:1.文件包含:首先在程序开头处加上#include以包含所需要的类文件vector 还有一定要加上using namespace std;2.变量声明:2.1 例:声明一个int向量以替代一维的数组:vector a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。

2.2 例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector a.同理想用向量代替三维数组也是一样,vector a;再往上面依此类推.3.具体的用法以及函数调用:3.1 如何得到向量中的元素?其用法和数组一样:例如:vector aint b = 5;a.push_back(b);//该函数下面有详解cout 1.push_back 在数组的最后添加一个数据 2.pop_back 去掉数组的最后一个数据 3.at 得到编号位置的数据4.begin 得到数组头的指针5.end 得到数组的最后一个单元+1的指针6.front 得到数组头的引用7.back 得到数组的最后一个单元的引用8.max_size 得到vector最大可以是多大9.capacity 当前vector 分配的大小10.size 当前使用数据的大小11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值12.reserve 改变当前vecotr所分配空间的大小13.erase 删除指针指向的数据项14.clear 清空当前的vector15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)17.empty 判断vector是否为空18.swap 与另一个vector交换数据3.2 详细的函数实现功能:其中vector c.c.clear()移除容器中所有数据。

c中vector的用法

c中vector的用法推荐文章一个有性格的智能友好机器人——Vector 热度: vector和list的区别是什么热度:如何将jpg转换成cad 热度:c中vector的用法的用法你知道吗?下面小编就跟你们详细介绍下c中vector的用法的用法,希望对你们有用。

c中vector的用法的用法如下:1 基本操作(1)头文件#include<vector>.(2)创建vector对象,vector<int> vec;(3)尾部插入数字:vec.push_back(a);(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.vector<int>::iterator it;for(it=vec.begin();it!=vec.end();it++)cout<<*it<<endl;(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始(8)向量大小:vec.size();(9)清空:vec.clear();2vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。

下面是一段简短的程序代码:复制代码#include<stdio.h>#include<algorithm>#include<vector>#include<iostream>using namespace std;typedef struct rect{int id;int length;int width;//对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。

c++ vector 用法

c++ vector 用法在C++ 中,vector 是一个十分有用的容器。

它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

C++ 中数组很坑,有没有类似Python 中list 的数据类型呢?类似的就是vector!vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。

和string 对象一样,标准库将负责管理与存储元素相关的内存。

我们把vector 称为容器,是因为它可以包含其他对象。

一个容器中的所有对象都必须是同一种类型的。

一、什么是vector?向量(vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。

跟任意其它类型容器一样,它能够存放各种类型的对象。

可以简单的认为,向量是一个能够存放任意类型的动态数组。

二、容器特性1.顺序序列顺序容器中的元素按照严格的线性顺序排序。

可以通过元素在序列中的位置访问对应的元素。

2.动态数组支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。

操供了在序列末尾相对快速地添加/删除元素的操作。

3.能够感知内存分配器的(Allocator-aware)容器使用一个内存分配器对象来动态地处理它的存储需求。

三、基本函数实现1.构造函数•vector():创建一个空vector•vector(int nSize):创建一个vector,元素个数为nSize •vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t•vector(const vector&):复制构造函数•vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中2.增加函数•void push_back(const T& x):向量尾部增加一个元素X •iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x•iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x•iterator insert(iterator it,const_iteratorfirst,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据3.删除函数•iterator erase(iterator it):删除向量中迭代器指向元素•iterator erase(iterator first,iterator last):删除向量中[first,last)中元素•void pop_back():删除向量中最后一个元素•void clear():清空向量中所有元素4.遍历函数•reference at(int pos):返回pos位置元素的引用•reference front():返回首元素的引用•reference back():返回尾元素的引用•iterator begin():返回向量头指针,指向第一个元素•iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置•reverse_iterator rbegin():反向迭代器,指向最后一个元素•reverse_iterator rend():反向迭代器,指向第一个元素之前的位置5.判断函数•bool empty() const:判断向量是否为空,若为空,则向量中无元素6.大小函数•int size() const:返回向量中元素的个数•int capacity() const:返回当前向量所能容纳的最大元素值•int max_size() const:返回最大可允许的 vector 元素数量值7.其他函数•void s;):交换两个同类型向量的数据•void assign(int n,const T& x):设置向量中前n个元素的值为x•void assign(const_iterator first,const_iteratorlast):向量中[first,last)中元素设置成当前向量元素8.看着清楚1.push_back 在数组的最后添加一个数据2.pop_back 去掉数组的最后一个数据3.at 得到编号位置的数据4.begin 得到数组头的指针5.end 得到数组的最后一个单元+1的指针6.front 得到数组头的引用7.back 得到数组的最后一个单元的引用8.max_size 得到vector最大可以是多大9.capacity 当前vector分配的大小10.size 当前使用数据的大小11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值12.reserve 改变当前vecotr所分配空间的大小13.erase 删除指针指向的数据项14.clear 清空当前的vector15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)17.empty 判断vector是否为空18.swap 与另一个vector交换数据四、基本用法#include < vector>using namespace std;五、简单介绍1.vector<类型>标识符2.vector<类型>标识符(最大容量)3.vector<类型>标识符(最大容量,初始所有值)4.Int i[5]={1,2,3,4,5}vector<类型>vi(I,i+2);//得到i索引值为3以后的值5.vector< vector< int> >v; 二维向量//这里最外的<>要有空格。

C++中vector使用详细说明(转)

C++中vector使⽤详细说明(转)转⾃:⼀、向量的介绍向量 vector 是⼀种对象实体, 能够容纳许多其他类型相同的元素, 因此⼜被称为容器。

与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的⼀种⾃定义的数据类型, 可以⼴义上认为是数组的增强版。

在使⽤它时, 需要包含头⽂件 vector, #include<vector>vector 容器与数组相⽐其优点在于它能够根据需要随时⾃动调整⾃⾝的⼤⼩以便容下所要放⼊的元素。

此外, vector 也提供了许多的⽅法来对⾃⾝进⾏操作。

⼆、向量的声明及初始化vector 型变量的声明以及初始化的形式也有许多, 常⽤的有以下⼏种形式:vector<int> a ; //声明⼀个int型向量avector<int> a(10) ; //声明⼀个初始⼤⼩为10的向量vector<int> a(10, 1) ; //声明⼀个初始⼤⼩为10且初始值都为1的向量vector<int> b(a) ; //声明并⽤向量a初始化向量bvector<int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值除此之外, 还可以直接使⽤数组来初始化向量:int n[] = {1, 2, 3, 4, 5} ;vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值三、元素的输⼊及访问元素的输⼊和访问可以像操作普通的数组那样, ⽤cin>>进⾏输⼊, cout<<a[n]这样进⾏输出:⽰例:1 #include<iostream>2 #include<vector>34 using namespace std ;56 int main()7 {8 vector<int> a(10, 0) ; //⼤⼩为10初值为0的向量a910 //对其中部分元素进⾏输⼊11 cin >>a[2] ;12 cin >>a[5] ;13 cin >>a[6] ;1415 //全部输出16 int i ;17 for(i=0; i<a.size(); i++)18 cout<<a[i]<<" " ;1920 return 0 ;21 }在元素的输出上, 还可以使⽤遍历器(⼜称迭代器)进⾏输出控制。

c vector用法

c vector用法摘要:1.C++中的容器2.C vector 的定义与初始化3.C vector 的基本操作4.C vector 的常用功能5.C vector 的注意事项正文:C++是一种功能强大的编程语言,它提供了丰富的数据结构和算法,以满足各种编程需求。

在C++中,容器是一种重要的数据结构,它可以存储和管理数据。

今天我们将介绍C++中的一种常用容器——C vector。

C vector,中文名为C 向量,是C++标准库中的一个容器,用于存储同一类型的数据元素。

C vector 可以在程序运行过程中动态地调整其大小,因此它非常适合存储动态数据。

一、C vector 的定义与初始化要使用C vector,首先需要包含相应的头文件<vector>。

然后,可以使用以下方式定义一个C vector:```vector<数据类型> 变量名(容量);```其中,数据类型可以是int、float、double 等任意类型,容量表示C vector 的初始大小。

例如,定义一个存储整数的C vector:```vector<int> nums(10);```定义之后,C vector 会自动分配内存,并将所有元素初始化为0 或0.0。

二、C vector 的基本操作C vector 提供了许多基本操作,包括访问、修改、添加和删除元素等。

以下是一些常用的操作:1.访问元素:使用下标操作符[],如下:```int num = nums[i];```2.修改元素:使用赋值操作符=,如下:```ums[i] = num;```3.添加元素:使用insert() 函数,如下:```ums.insert(nums.begin(), num);```4.删除元素:使用erase() 函数,如下:```ums.erase(nums.begin());```三、C vector 的常用功能C vector 还提供了许多有用的功能,包括遍历、排序、查找等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++Vector用法C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。

要解决此问题我们自己实现这样的类。

在标准C++中,用容器向量(vector)实现。

容器向量也是一个类模板。

标准库vector类型使用需要的头文件:#include<vector>。

vector是一个类模板。

不是一种数据类型,vector<int>是一种数据类型。

Vector的存储空间是连续的,list不是连续存储的。

一、定义和初始化vector<typeName>v1;//默认v1为空,故下面的赋值是错误的v1[0]=5;vector<typeName>v2(v1);或v2=v1;或vector<typeName>v2(v1.begin(),v1.end());//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。

vector<typeName>v3(n,i);//v3包含n个值为i的typeName类型元素vector<typeName>v4(n);//v4含有n个值为0的元素int a[4]={0,1,2,3,3};vector<int>v5(a,a+5);//v5的size为5,v5被初始化为a的5个值。

后一个指针要指向将被拷贝的末元素的下一位置。

vector<int>v6(v5);//v6是v5的拷贝vector<类型>标识符(最大容量,初始所有值);二、值初始化1>如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。

2>如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。

3>如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

三、vector对象最重要的几种操作1.v.push_back(t)在容器的最后添加一个值为t的数据,容器的size变大。

另外list有push_front()函数,在前端插入,后面的元素下标依次增大。

2.v.size()返回容器中数据的个数,size返回相应vector类定义的size_type的值。

v.resize(2*v.size)或v.resize(2*v.size,99)将v的容量翻倍(并把新元素的值初始化为99)3.v.empty()判断vector是否为空4.v[n]返回v中位置为n的元素5.v.insert(pointer,number,content)向v中pointer指向的位置插入number个content 的内容。

还有v.insert(pointer,content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。

6.v.pop_back()删除容器的末元素,并不返回该元素。

7.v.erase(pointer1,pointer2)删除pointer1到pointer2中间(包括pointer1所指)的元素。

vector中删除一个元素后,此位置以后的元素都需要往前移动一个位置,虽然当前迭代器位置没有自动加1,但是由于后续元素的顺次前移,也就相当于迭代器的自动指向下一个位置一样。

8.v1==v2判断v1与v2是否相等。

9.!=、<、<=、>、>=保持这些操作符惯有含义。

10.vector<typeName>::iterator p=v1.begin();p初始值指向v1的第一个元素。

*p取所指向元素的值。

对于const vector<typeName>只能用vector<typeName>::const_iterator类型的指针访问。

11.p=v1.end();p指向v1的最后一个元素的下一位置。

12.v.clear()删除容器中的所有元素。

12.v.clear()删除容器中的所有元素。

#include<algorithm>中的泛函算法搜索算法:find()、search()、count()、find_if()、search_if()、count_if()分类排序:sort()、merge()删除算法:unique()、remove()生成和变异:generate()、fill()、transformation()、copy()关系算法:equal()、min()、max()sort(v1.begin(),vi.begin()+v1.size/2);对v1的前半段元素排序list<char>::iterator pMiddle=find(cList.begin(),cList.end(),'A');找到则返回被查内容第一次出现处指针,否则返回end()。

vector<typeName>::size_type x;vector<typeName>类型的计数,可用于循环如同for(int i)初学C++的程序员可能会认为vector的下标操作可以添加元素,其实不然:vector<int>ivec;//empty vectorfor(vector<int>::size_type ix=0;ix!=10;++ix)ivec[ix]=ix;//disaster:ivec has no elements上述程序试图在ivec中插入10个新元素,元素值依次为0到9的整数。

但是,这里ivec是空的vector对象,而且下标只能用于获取已存在的元素。

这个循环的正确写法应该是:for(vector<int>::size_type ix=0;ix!=10;++ix)ivec.push_back(ix);//ok:adds new element with value ix警告:必须是已存在的元素才能用下标操作符进行索引。

通过下标操作进行赋值时,不会添加任何元素。

仅能对确知已存在的元素进行下标操作四、内存管理与效率1.使用reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下。

关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。

(要知道这个最大值,只要调用名叫max_size 的成员函数。

)对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。

vector容器支持随机访问,因此为了提高效率,它内部使用动态数组的方式实现的。

在通过reserve()来申请特定大小的时候总是按指数边界来增大其内部缓冲区。

当进行insert 或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配当前大小的1.5~2倍的新内存区,再把原数组的内容复制过去。

所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。

正如上面的代码告诉你的那样。

而进行pop_back操作时,capacity并不会因为vector容器里的元素减少而有所下降,还会维持操作之前的大小。

对于vector容器来说,如果有大量的数据需要进行push_back,应当使用reserve()函数提前设定其容量大小,否则会出现许多次容量扩充操作,导致效率低下。

reserve成员函数允许你最小化必须进行的重新分配的次数,因而可以避免真分配的开销和迭代器/指针/引用失效。

但在我解释reserve为什么可以那么做之前,让我简要介绍有时候令人困惑的四个相关成员函数。

在标准容器中,只有vector和string提供了所有这些函数。

(1)size()告诉你容器中有多少元素。

它没有告诉你容器为它容纳的元素分配了多少内存。

(2)capacity()告诉你容器在它已经分配的内存中可以容纳多少元素。

那是容器在那块内存中总共可以容纳多少元素,而不是还可以容纳多少元素。

如果你想知道一个vector或string中有多少没有被占用的内存,你必须从capacity()中减去size()。

如果size和capacity返回同样的值,容器中就没有剩余空间了,而下一次插入(通过insert或push_back等)会引发上面的重新分配步骤。

(3)resize(Container::size_type n)强制把容器改为容纳n个元素。

调用resize之后,size将会返回n。

如果n小于当前大小,容器尾部的元素会被销毁。

如果n大于当前大小,新默认构造的元素会添加到容器尾部。

如果n大于当前容量,在元素加入之前会发生重新分配。

(4)reserve(Container::size_type n)强制容器把它的容量改为至少n,提供的n不小于当前大小。

这一般强迫进行一次重新分配,因为容量需要增加。

(如果n小于当前容量,vector 忽略它,这个调用什么都不做,string可能把它的容量减少为size()和n中大的数,但string 的大小没有改变。

在我的经验中,使用reserve来从一个string中修整多余容量一般不如使用“交换技巧”,那是条款17的主题。

)这个简介表示了只要有元素需要插入而且容器的容量不足时就会发生重新分配(包括它们维护的原始内存分配和回收,对象的拷贝和析构和迭代器、指针和引用的失效)。

所以,避免重新分配的关键是使用reserve尽快把容器的容量设置为足够大,最好在容器被构造之后立刻进行。

例如,假定你想建立一个容纳1-1000值的vector<int>。

没有使用reserve,你可以像这样来做:vector<int>v;for(int i=1;i<=1000;++i)v.push_back(i);在大多数STL实现中,这段代码在循环过程中将会导致2到10次重新分配。

(10这个数没什么奇怪的。

记住vector在重新分配发生时一般把容量翻倍,而1000约等于210。

)把代码改为使用reserve,我们得到这个:vector<int>v;v.reserve(1000);for(int i=1;i<=1000;++i)v.push_back(i);这在循环中不会发生重新分配。

在大小和容量之间的关系让我们可以预言什么时候插入将引起vector或string执行重新分配,而且,可以预言什么时候插入会使指向容器中的迭代器、指针和引用失效。

例如,给出这段代码,string s;...if(s.size()<s.capacity()){s.push_back('x');}push_back的调用不会使指向这个string中的迭代器、指针或引用失效,因为string的容量保证大于它的大小。

相关文档
最新文档