vector是什么
vector是C++标准模板库(STL-Standard Template Library)中的概念内容,它是一个能够操作多种数据结构和算法的模板类和函数库,是一个封装了动态大小数组的顺序容器(Sequence Container)。vector被认为是一个容器,也是因为它能够像容器一样存放各种类型的对象,可以简单的认为,vector是一个能够存放任意类型的动态数组。
扩展知识:
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
模板是C++程序设计语言中的一个重要特征,而标准模板库正是基于此特征。标准模板库使得C++编程语言在有了同Java一样强大的类库的同时,保有了更大的可扩展性。
容器:包含、放置数据的地方。
迭代器:在容器中指出一个位置、或成对使用以划定一个区域,用来限定操作所涉及到的数据范围。
算法:要执行的操作。
容器特性
关于STL容器,最令人称赞的特性之一就是只要不超过它们的最大容许元素数量值(容量),它们就可以自动增长到足以容纳放进去的数据(要想知道这个最大值,调用max_size的容器的内置成员函数即可,使用reserve()函数可以提前设定容量大小)。
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
vector内置基本函数
(往右滑动可看全表格信息)
函数原型 | 说明 |
---|---|
构造函数: | |
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中 |
增加函数: | |
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_iterator first,const_iterator last) | 向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据 |
删除函数: | |
iterator erase(iterator it) | 删除向量中迭代器指向元素 |
iterator erase(iterator first,iterator last) | 删除向量中[first,last)中元素 |
void pop_back() | 删除向量中最后一个元素 |
void clear() | 清空向量中所有元素 |
遍历函数: | |
reference at(int pos) | 返回pos位置元素的引用 |
reference front() | 返回首元素的引用 |
reference back() | 返回尾元素的引用 |
iterator begin() | 返回向量头指针,指向第一个元素 |
iterator end() | 返回向量尾指针,指向向量最后一个元素的下一个位置 |
reverse_iterator rbegin() | 反向迭代器,指向最后一个元素 |
reverse_iterator rend() | 反向迭代器,指向第一个元素之前的位置 |
判断函数: | |
bool empty() const | 判断向量是否为空,若为空,则向量中无元素 |
大小函数: | |
int size() const | 返回向量中元素的个数(实际数据的个数) |
int max_size() const | 返回最大可允许的vector元素数量值 |
int capacity() const | 返回当前向量所能容纳的最大元素值 |
其他函数: | |
void swap(vector&) | 交换两个同类型向量的数据 |
void assign(int n,const T& x) | 设置向量中第n个元素的值为x |
void assign(const_iterator first, const_iterator last) | 向量中[first,last)中元素设置成当前向量元素 |
代码eg
vector对象的初始化eg:
假设定义的是int型vector向量,可以有如下方式:
定义具有10个int型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定
vector<int>a(10);
定义具有10个整型元素的向量,且给出的每个元素初值为1
vector<int>a(10,1);
用向量b给向量a赋值,a的值完全等价于b的值
vector<int>a(b);
将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
vector<int>a(b.begin(),b.begin+3);
从数组中获得初值
int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7);
定义其他类型的vector,如使用自定义的枚举型eg:
typedef enum {
EVENT_A = -1
EVENT_B,
EVENT_C,
EVENT_UNKNOWN,
} event_type_t;
定义一个自定义枚举型vector
Vector<event_type_t> event;
vector对象的常用函数eg:
包含头文件
#include <vector>
定义int型vector向量a和b
vector<int> a,b;
b为向量,将b的0-2个元素赋值给向量a
a.assign(b.begin(),b.begin()+3);
a含有4个值为2的元素
a.assign(4,2);
返回a的最后一个元素
a.back();
返回a的第一个元素
a.front();
返回a的第i元素,当且仅当a存在
a[i];
/清空a中的元素
a.clear();
//判断a是否为空,空则返回true,非空则返回false
a.empty();
//删除a向量的最后一个元素
a.pop_back();
//删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束
a.erase(a.begin()+1,a.begin()+3);
//在a的最后一个向量后插入一个元素,其值为5
a.push_back(5);
//在a的第一个元素(从第0个算起)位置插入数值5,
a.insert(a.begin()+1,5);
//在a的第一个元素(从第0个算起)位置插入3个数,其值都为5
a.insert(a.begin()+1,3,5);
//b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6)
a.insert(a.begin()+1,b+3,b+6);
//返回a中元素的个数
a.size();
//返回a在内存中总共可以容纳的元素个数
a.capacity();
//将a的现有元素个数调整至10个,多则删,少则补,其值随机
a.resize(10);
//将a的现有元素个数调整至10个,多则删,少则补,其值为2
a.resize(10,2);
//将a的容量扩充至100,
a.reserve(100);
//b为向量,将a中的元素和b中的元素整体交换
a.swap(b);
//b为向量,向量的比较操作还有 != >= > <= <
a==b
用push_back给向量尾部增加多个元素,体会一下eg:
//定义一个int型vector
vector<int> a;
//分别先后把5和10压入vector,最后向量存储是这样:a[0]是5,a[1]就是10
a.push_back(5);
a.push_back(10);
用vector作为函数的参数或者返回值时,需要注意写法eg:
//注意“&”,一定记得写上,不能丢掉
double test(vector<int>&a, vector<int>&b)
用迭代器iterator访问vector元素eg:
vector<int> a;
//定义一个可以迭代int型vector的迭代器iter,并使它指向a的首位(地址)
vector<int>::iterator iter = a.begin();
//iter++指的是向后迭代一位,直到iter到超出末端迭代器为止,输出迭代器iter指向的值
for( ; iter!=a.end(); iter++)
cout<<(*iter);
往期文章
如果觉得文章有用,帮忙点赞或在看,给个心里安慰