vector

vector,是一个顺序表,是表示可变大小数组的序列容器:范型实现

 

vector:成员都为指针:T*

 

_start:第一个元素的起始位置,eg;int,第一个字节的位置

 

_finish:最后一个元素的结束位置,eg:int,最后一个字节的下一个字节位置

 

_endOfStorage:已分配好的空间结束位置

 

 

vector与string的区别:

 

 

 

 

1,迭代器生效问题:

 

(1)inser ( iterator it, T x) :插入可能会导致增容,会释放原有空间,开辟新的空间,拷贝原有内容

                                               插入之前的迭代器位置可能已经失效,成为一个野指针

 

(2)erase ( iterator ) :访问越界

int a[] = {1,2,3,4,5,6,7};
vector<int> v1(a,a+sizeof(a)/sizeof(int))
//以下代码编译器会报错
//删除后可能会导致 vit 位置失效,对失效的迭代器++后程序会崩溃
auto vit = v1.begin();
while(vit != v1.end()){
    if(*vit % 2 == 0){
        v1.erase(vit);
    }
//1,2,3,4,5
// 5 删完之后还会++一次,会跑到end()的后面,从而发生访问越界
    vit++;
}

//要改成以下代码
//erase会返回删除位置后的下一个位置
//auto vit = v1.begin();
vector<int>::iterator vit = v1.begin();
while(vit != v1.end()){
    if(*vit % 2 == 0)
        vit = v1.erase(vit);
    else
        vit++;
}

2迭代器失效解决办法

 

调用完 insert,erase接口后,重新获取迭代器,即获取接口的返回值,防止迭代器失效

 

3,swa函数:底层实现一样,本质上内部调用的为vector的成员函数

 

1)全局交换函数 swap(v1, v2); -->{ v1.swap(v2) }

2)成员函数交换 v1.swap(v2);  -->v1.swap(v2)

3)通用成员函数交换:swap(T& v1, T& v2)-->{ T temp = s1;  s1 = s2;  s2 = temp; }

 

4,手动释放vector的空间

//手动释放vector空间
          vector<int> v1(50, 1);
          cout << v1.capacity() << endl;
          v1.resize(0);//不能,只是改变内存中值的数量,无法改变容量的大小
          v1.reserve(0);//不能,只是增容的,无法减少容量
          //两种方法释放
          {
                   vector<int>v2;//在局部域中定义一个空的临时的变量vector
                   v2.swap(v1);//调用vector swap函数,完成空间的交换
                   //然后走出括号调用v2的析构函数释放掉原v1的空间
          }
          
          {
                   //
                   v1.resize(0);//先将值清空
                   v1.shrink_to_fit();//将容量改变到合适的范围
          }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值