vector(向量)类模板定义在头文件vector中,提供五种构造函数,可以针对不同情况进行初始化:
vector<type> name;
//构造一个空的vector对象vector<type> name(length);
//构造一个长度为length的vector对象,所有元素初始化为0vector<type> name(length,n);
//构造一个长度为length的vector对象,所有元素初始化为nvector<type> name(name1);
//复制构造,用已定义的对象name1初始化构造namevector<type> name(array,array+length);
//构造一个长度为length+1的vector对象,并用数组初始化。array为type类型数据的地址(指针或数组名),从array指向的元素起向后依次对vector中的元素赋值。
vector类模板重载了赋值运算符=,允许同类型的vector对象相互赋值,对长度没有要求,即可以改变赋值目标对象的大小,使得赋值目标的长度和赋值源的长度(size())保持一致。若赋值目标的长度小于赋值源长度,则对其进行扩充,使得扩充后的capacity和赋值源的size保持一致。
vector的容量信息相关的成员函数:
- size():返回当前对象中已存放(初始化)的元素的个数。
- max_size():返回当前对象所能容纳的最大元素个数,取决于系统的硬件结构。
- capacity():返回当前已经分配的空间所能容纳的元素个数。初始值为最初分配的空间大小(元素个数),当存放空间已满,再增加元素个数时,capacity在原来的基础上翻倍。
- vector的访问对象的成员函数:
- front():返回vector对象中的第一个元素
- back():返回vector对象的最后一个元素
operator [ ](size_type,n)
:[ ]的重载,返回对象的第n+1个元素
- 在vector中插入元素的方法
- push_back(const T&):在向量末尾插入一个T类型的元素,size+1,capacity如果不足则翻倍。
- insert(iterator it,const T&):在it所指的位置前插入新元素。
- insert (iterator it, size_type n,const T&X):在it所指位置前插入n个值为X的T类数据。
- 在vector中声明迭代器
vector类包含了一个typedef iterator,这是一个public成员。通过iterator,可以声明向量中的迭代 器。例如,语句:
vector<int>::iterator intVeciter;
将intVecIter声明为int类型的向量容器迭代器。
因为iterator是一个定义在vector类中的typedef,所以必须使用容器名(vector)、容器元素类型 和作用域符来使用iterator。
表达式:
++intVecIter
将迭代器intVecIter加1,使其指向容器中的下一个元素。表达式:*intVecIter
返回当前迭代器位置上的元素。
迭代器上的这些操作和指针上的相应操作是相同的。
vector_name.begin()返回指向第一个元素的迭代器,vector_name.end()返回指向末尾元素后一位的迭代器。 使用STL库函数输出向量对象
正向输出,每个元素后输出一个ch:copy(at.begin(), at.end(), ostream_iterator <type>(cout,"ch"));
逆向输出,每个元素后输出一个ch:reverse_copy(at.begin(), at.end(), ostream_iterator <type>(cout,"ch"));
使用上述代码时,应include头文件functional和iterator:前者对应copy函数,后者对ostream_iterator进行定义。在向量中删除对象
- pop_back(const T&):删除向量中的最后一个元素,所分配的空间仍然保留
- erase(iterator it):删除it所指向的元素
- clear():删除向量中的所有元素,empty()返回true。
测试代码(部分):
#include <vector>
#include <functional>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{
int ay[10] = {1,2,3,4,5,6,7,8,9};
int *p = ay;
vector<int> at(ay,ay + 7);
vector<int> as(p,p + 3);
copy(as.begin(),as.end(),ostream_iterator <int>(cout,"*"));
cout << endl;
at.pop_back();
cout << endl << at.size() << endl << at.capacity() << endl;
as = at;
copy(at.begin(),at.end(),ostream_iterator <int>(cout,"-"));
cout << endl << as.size() << endl << as.capacity() << endl;
cout << *(at.begin()+1) << endl << *at.end() << endl;
return 0;
}