一维向量 vector

来源:互联网 发布:手机mac怎么改 编辑:程序博客网 时间:2024/05/20 06:53

和数组一样vector为他们存储的元素一同连续的存储空间。可以通过指使用针偏移的方式来访问向量中存储的元素。

但是与数组不同的是,向量的大小可以自动调整,以确保元素的插入操作可以完成。

为了防止每次插入一个元素时,都需要增加向量的容量capacity,以及与此伴随的内存复制与释放。为了降低这些操作带来的低效率,vector容器在增加新的元素前,会多分配一些地址,来容纳原先向量内部的元素,当前插入的元素,以及将来可能插入的元素。

向量中常用的方法有:

在迭代输出中有:

begin() 和 end()用来输出向量中的元素:

vector <double> d1_vector(4);for( std::vector<double>::iterator it = d1_vector.begin() ; it != d1_vector.end(); ++it ){    cout << *it << "\t";}
如果你的编译器支持C++11标准,可以使用如下auto语句

for (auto it = d1_vector.begin() ; it != d1_vector.end(); ++it)            std::cout << ' ' << *it;cout<<"\n";
注意:这里的.end()指向最后一个元素的下一个元素位置,不要尝试访问该位置元素,否则会引起下标越界异常。

这里申请了可用来存储4个元素的地址空间。如果使用:

cout<<d1_vector.capacity()<<"\t"<<d1_vector.size()<<"\n";
将向量的容量和尺寸输出时,会发现它们的值都为4。当然,使用这种方式定义的d1_vector的值均为0;如果想让它们的值初始化为全1,可以使用:

vector <double> d1_vector(4,1);

向量的声明和定义也可以使用

vector <double> d_vector;
这样,d_vector的容量capacity和大小size均为0;

再开看另一种初始化,使用数组初始化向量:

double arr[] = {1.1,1.2,1.3,1.4,1.5};vector<double> d3_vector(arr,arr+sizeof(arr)/sizeof(double));for( std::vector<double>::iterator it = d3_vector.begin() ; it != d3_vector.end(); ++it ){    cout << *it << "\t";}
这里定义了一个double类型的数组arr,它的大小为5。

然后使用vector<double> d3_vector(arr,arr+sizeof(arr)/sizeof(double))的方法,将数组的内容复制到d3_vector向量中。要注意如果使用偏移量计算,如果arr的起始地址为0,那么arr+sizeof(arr)/sizeof(double)就为5。vector<double> d3_vector(arr,arr+sizeof(arr)/sizeof(double))就等价于vector<double> d3_vector(0,5),共占用六个地址。最后一个位置是空着的,就像是在迭代输出中,

it != d1_vector.end();

end指向的是最后一个元素的下一个位置。使用这些方式初始化的向量,它们的容量和大小均相同,且为初始化时的大小。从文章开始到现在依次为d1_vector ==> 4, d_vector ==> 0,   d3_vector ==> 5;


在获取容量、大小以及最大容量有:

d3_vector.push_back(1.6);cout<< d3_vector.capacity()<<endl;cout<< d3_vector.size()<<endl;cout<< d3_vector.max_size()<<endl;
当使用push_back方法向d3_vector尾部添加一个元素1.6时,它的capacity变为10,size变为6,最大容量为一个很大的数。

插入或者删除值:

d3_vector.push_back(1.6);d3_vector.push_back(1.7);d3_vector.pop_back();cout<< d3_vector.capacity()<<endl;cout<< d3_vector.size()<<endl;cout<< d3_vector.max_size()<<endl;for( std::vector<double>::iterator it = d3_vector.begin() ; it != d3_vector.end(); ++it ){    cout << *it << "\t";}
使用push_back()的方法在尾部增加元素1.6,1.7.,然后使用pop_back()的方法弹出尾部的元素。这两种方法调用一次只会增加/删除一个元素,而且在vector的尾部就行操作。

获取指定位置的值:

cout<<d3_vector.front()<<endl;cout<<d3_vector.back()<<endl;cout<< d3_vector.at(3)<<endl;
分别用来获取首段元素1.1, 尾部元素1.6(1.7已经被弹出了).以及下标为3的元素1.4(类似于arr[4]);

一般情况来说,如果多次使用pop_back进行弹出操作,即使弹出了所有的元素,它的容量都不会变(capacity = 10),但是它的尺寸size会递减一直到0(没有元素,empty为true ,此时的效果就是vector <double> d_vector),然后变为一个很大的值(再次弹出,d3_vector.empty()的值为false,是不是很奇怪)。


对于使用 d3_vector.at(3);这句话,需要判断下标是否越界 (包含标准异常头文件#include <stdexcept>)。

使用out_of_range来检测越界异常

  try{        cout<< d3_vector.at(7)<<endl;    }catch(out_of_range){        cout<< "out of range...\n";    }
或者使用 ... 连续的三个点来捕获所有的异常
 try{        cout<< d3_vector.at(7)<<endl;    }catch(... ){        cout<< "out of range...\n";    }


0 0
原创粉丝点击