行业知识
vector容器 常用函数
vector的介绍
vector���STL(标准模板库)中最常见的容器,它是一种顺序容器,支持随机访问。可以用sort对其进行排序,底层数据结构是数组,可以随机访问元素。
vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。
注:如果要使用vector,则需要添加vector头文件,即#include,除此之外,还需要添加using namespace std;
vector的定义
C++中构造vector可以使用以下任意一种参数方式:
语法:
1.vector();
无参数 - 构造一个空的vector
2.vector(size_type num, const TYPE &val);
数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector
举例,假如构造一个包含3个值为4的vector
vector v1(3,4);
3.vector(const vector &from);
vector(from) - 构造一个与vector from 相同的vector
4.vector(input_iterator start, input_iterator end);
迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间)
#include#include using namespace std;int main() {vector sdt;//无参构造vector s1(4,100);//构造并初始化4个100vector s2(s1.begin(), s1.end());//使用迭代器进行初始化构造vector s3(s1);//拷贝构造return 0;} 访问vector容器内元素的方法
1.通过下标访问
和访问普通的数组是一样的,对一个定义为vector v的vector容器,直接使用v[index]访问即可,其中index∈[0,v.size()−1]
2.通过迭代器访问
迭代器可以理解为一种类似指针的东西
vector::iterator it;定义迭代器,得到了迭代器it之后,可以通过*it来访问vector中的元素
3.v[i]和*(v.begin()+i)是等价的
4.迭代器来实现了两种自加操作和自减操作
5.begin()函数的作为是为取v的首元素地址,end()函数并不是为了取v的尾元素地址,而是取尾元素地址的下一个地址。它作为迭代器末尾标志,不储存任何元素
6.在常用STL容器中,只有在vector和string中,才允许使用v.begin()+3这种迭代器加上整数的写法
vector常用函数
vector常用函数的时间复杂度:
push_back(),时间复杂度为O(1)pop_back(),时间复杂度为O(1)size(),时间复杂度为O(1)clear(),时间复杂度为O(N)insert(),时间复杂度为O(N)erase(),时间复杂度为O(N)
vector常用函数解读:
push_back(x)就是在vector后面添加一个元素xpop_back()用于删除vector的尾元素size()用来获得vector中元素的个数,返回的是unsigned类型,不过一般来说用%d不会出很大问题,这一点对所有STL容器都是一样的clear()用来清空vector中的所有元素insert(it,x)用来向vector的任意迭代器it处插入一个元素xerase(): 删除单个元素,erase(it)即删除迭代器为it处的元素。 删除一个区间内的所有元素,erase(first,last)即删除[first,last)内的所有元素 清空vector也可以使用v.erase(v.begin(),v.end());
其他相关函数:
vector对象的几个重要操作,举例说明如下:(1)a.assign(b.begin(), b.begin()+3);//b为向量,将b的0~2个元素构成的向量赋给a(2)a.assign(4,2);//是a只含4个元素,且每个元素为2(3)a.back();//返回a的最后一个元素(4)a.front();//返回a的第一个元素(5)a[i]; //返回a的第i个元素,当且仅当a[i]存在(6)a.clear();//清空a中的元素(7)a.empty();//判断a是否为空,空则返回ture,不空则返回false(8)a.pop_back();//删除a向量的最后一个元素(9)a.erase(a.begin()+1,a.begin()+3);//删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)(10)a.push_back(5);//在a的最后一个向量后插入一个元素,其值为5(11)a.insert(a.begin()+1,5);//在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4(12)a.insert(a.begin()+1,3,5);//在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5(13)a.insert(a.begin()+1,b+3,b+6);//b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8(14)a.size();//返回a中元素的个数;(15)a.capacity();//返回a在内存中总共可以容纳的元素个数(16)a.rezize(10);//将a的现有元素个数调至10个,多则删,少则补,其值随机(17)a.rezize(10,2);//将a的现有元素个数调至10个,多则删,少则补,其值为2(18)a.reserve(100);//将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才 显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) (19)a.swap(b);//b为向量,将a中的元素和b中的元素进行整体性交换(20)a==b; //b为向量,向量的比较操作还有!=,>=,,部分函数用法示例:
#include #include using namespace std;int main(){ typedef vector vecInt; vecInt vecint; // 添加数据 for (int i = 0; i
上一篇:个人网站支付对接详解,轻松实现支付功能,助力网站运营!
下一篇:国外怎么推广网站?