STL容器——vector

STL容器——vector

1、vector简介

  • vector是将元素置于一个动态数组中加以管理的容器
  • vector可以随机存储元素(支持索引值直接存取,用[]操作符或at()方法)
  • vector尾部增加或删除元素非常快速。但是在中部或者头部插入元素比较耗时。

vector与array的关系

array是静态空间,一旦配置了就不能改变大小了;vector是动态空间,随着元素的加入,内部会自动扩充空间以容纳新元素。

为了降低空间配置时的速度成本,vector时机配置大小可能比需求大一些,以备将来肯的扩充。

注意:动态增加大小,并不是在原来空间之后续接新的空间(无法保证元空间之后还有空间),而是一块更大的空间,然后将数据拷贝到新空间,并释放原空间,因此,对vector的操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。

2、vector的构造函数

vector<T> v;//采用模板实现类实现
vector(v.begin(),v.end());//将v[begin(),end())区间的元素拷贝给本身
vector(n,elem);//构造函数

vector<int> vecint;//存放int的vector容器



class C{};//类

vector<C*> vecC;//用于存放C对象指针的vector的容器

vector<C> vecC;//用于存放C对象的vector容器。

容器元素的存放是按值复制的方式进行的

void test()
{
    vector<int> vec;
    vector<float> vec1;
}

(2)带参数构造函数

vector(beg,end);//构造函数将[beg,end]区间中的元素拷贝给本身。注意:该区间是左闭右开的区间
vector(n,elem);//构造函数将n个elem拷贝给本身
vector(const vector &vec);//拷贝构造函数

1.用数组在进行构造:
int array[] ={0,1,2,3,4};
vector<int> vecintA(array, array+5);

2.用另一个容器来构造当前容器
vector<int> vecintB(vecintA.begin(),vecintA.end());
vector<int> vecintB(vecintA.begin(),vecintA.begin()+3);
vecint<int> vecintB(3,9);//初始化vector有三个9
vector<int> vecintD(vecintA);//拷贝构造
void test()
{
    int array[] = {0,1,2,3,4};
    vector<int> vec(array,array+5);

    vector<int> vecA(vec.begin(),vec.begin()+3);
    vector<int> vecB(3,9);//存在3个9
    vector<int> vecC(vec);
}

3、vector赋值

  • vector.assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身
  • vector.assign(n, elem);//将n个elem拷贝赋值给本身
  • vector& operator=(const vector &vec);//重载等号操作符
  • vector.swap(vec);//将vec与本身的元素互换
vector<int> vecIntA, vecIntB, vecIntC, vecIntD;
int iArray[ ] = {0,1,2,3,4};
vecIntA.assign(iArray,iArray+5); //注意是左闭右开区间的元素拷贝进去
vecIntB.assign(vecIntA.begin() , vecIntA.end() ); //用其它容器的迭代器作参数。
vecIntC.assign(3,9);
vector<int> vecIntD;
vecIntD = vecIntA;
vecIntA.swap(vecIntD); //两个容器中的元素个数可以不一致

4、vector长度操作

  • vector.size();//返回容器中元素的个数
  • vector.empty();//判断容器是否为空
  • vector.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置,如果容器变短,则尾部超出容器长度的元素被删除。
  • vector.resize(num, elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则尾部超出容器长度的元素被删除。
  • capacity();//容器的容量
  • reserve(int len);//容器预留len个元素长度,预留位置不能初始化,元素不可访问
int iArray[ ] = {1,2,3};
vector<int> vecInt(iArray, iArray+3);
int iSize = vecInt.size(); //iSize == 3;
bool bEmpty = vecInt.empty(); // bEmpty == false;
vecInt.resize(5); //此时里面包含 1,2,3,0,0 元素。
vecInt.resize(8,3); //此时里面包含 1,2,3,0,0,3,3,3 元素。
vecInt.resize(2); //此时里面包含 1,2 元素

5、vector存取元素

  • vector.at(idx);//返回索引idx处的值,如果idx越界,抛出out_of_range异常
  • vector[idx];//返回索引idx所指向的值,越界,直接报错
  • front();//返回容器内第一个元素
  • back();//返回容器中最后一个元素
vector<int> vecInt; //假设包含 1 ,3 ,5 ,7 ,9
vecInt.at(2) == vecInt[2] ; //5
vecInt.at(2) = 8; 或 vecInt[2] = 8;
vecInt 就包含 1, 3, 8, 7, 9 值
int iF = vector.front(); //iF==1
int iB = vector.back(); //iB==9
vector.front() = 11; //vecInt 包含{11,3,8,7,9}
vector.back() = 19; //vecInt 包含{11,3,8,7,19}

6、vector插入元素

  • vector.inset(pos,elem);//在pos处插入元素elem,返回新数据位置
  • vector.inset(pos, n,elem);//在pos处插入n个元素elem,无返回值
  • vector.inset(pos, beg,end);//在pos处[beg,end)区间的数据,无返回值
vector<int> vecB;
vecA.push_back(1);
vecA.push_back(3);
vecA.push_back(5);
vecA.push_back(7);
vecA.push_back(9);
vecA.insert(vecA.begin(), 11); //{11, 1, 3, 5, 7, 9}
vecA.insert(vecA.begin()+1,2,33); //{11,33,33,1,3,5,7,9}
vecA.insert(vecA.begin(), vecB.begin(), vecB.end() );

7、vector删除元素

  • push_back(elem);//尾部插入元素elem
  • pop_back();//删除最后一个元素
  • vector.erase(pos);//删除pos处的元素,返回下一个数据的位置
  • vector.erase(beg,end);//删除[beg,end)之间的元素
  • vector.clear();//删除容器内所有元素
vector<int>::iterator itBegin=vecInt.begin()+1;
vector<int>::iterator itEnd=vecInt.begin()+2;
vecInt.erase(itBegin,itEnd);
vecInt.clear(); //容器为空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值