当前位置: 首页 > news >正文

c++--vector

1.定义vector

vector的定义分为四种

(1)vector()   ——————无参构造

(2)vector(size_t n,const value_type& val = value_type())   ——————构造并初始化n个val

(3)vector(const vector& v1) ———————拷贝构造

(4)vector(inputiterator first,inputiterator last) ————使用迭代器进行初始化

代码模拟实现:

namespace c_simplystudy:
{
template<class T>
class vector
{
public:
    vector()
    {
        _start = nullptr;
        _finish = nullptr;
        _endOfStorage = nullptr;
    }
    vector(int n, const T& value = T())
        :_start(new T[n])
        ,_finish(_start+n)
        ,_endOfStorage(_finish)
    {
        for (int i = 0; i < n; i++)
        {
            *(_start + i) = value;
        }
    }
template<class InputIterator>
    vector(const vector<T>& v)
        :_start(nullptr)
        ,_finish(nullptr)
        , _endOfStorage(nullptr)
     {
         reverse(v.capacity());
         iterator it = begin();
         const iterator last = cbegin();
         while (it != last)
         {
             *it++ = *last++;
         }
         _finish = it;
     }
     vector(InputIterator first, InputIterator last)
     {
         while (first != last)
         {
             push_back(*first);
             first++;
         }
     }
private:
iterator _start; // 指向数据块的开始
iterator _finish; // 指向有效数据的尾
iterator _endOfStorage; // 指向存储容量的尾
};
}

2.vector迭代器的使用与空间增长控制

迭代器:

 (1)begin()————获取第一个数据位置的iterator/const_iterator

 (2)end()————获取最后一个数据的下 一个位置的iterator/const_iterator

 (3)rbegin()————获取最后一个数据位置的reverse_iterator

 (4)rend()————获取第一个数据前一个位置的reverse_iterator

空间增长:
 (1)size()————获取数据个数

 (2)capacity()————获取容器容量

不同的编译器下,容器“满了”时,扩容的规则不同,在VS下是按1.5倍增长的,g++则是按2倍增长

 (3)empty()————判空

 (4)reserve()————改变capacity

reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代 价缺陷问题

 (5)resize(n,val)————改变size(n为改变后的size,val为用于初始化的值)

如果n<size,则size=n,不进行初始化;如果n>capacity,则扩容至n,并且将未初始化的数据初始化为val

3.vector增删查改

 (1)push_back()————尾插

 (2) pop_back()————尾删

 (3)find()————查找

如果存在则返回位置

 (4)insert()————插入

 (5)erase()————删除

 (6)swap()————交换两个vector

 (7)operate[]————下标索引

4.vector迭代器失效

vector的增删会导致迭代器失效——实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)

迭代器失效有两种情况:

(1)当 it 用vector.begin()初始化后,如果对vector进行增或者可能会导致其扩容的操作,则vector在扩容时会释放掉旧空间,begin()会指向新空间,而这里的 it 却仍指向被释放掉的旧空间,此时用 it 进行迭代器操作则会发生迭代器失效

int main()
{
    vector<int> v{1,2,3,4,5};
    auto it=v.begin();
    v.reserve(100);     //通过扩容使迭代器失效
    while(it != v.end())
    {
        cout << *it << " ";
        ++it;
    }            //vs下会直接崩溃
    return 0;
}

(2)继续将 it 用vector中的迭代器进行初始化,如果使用erase将 it 指向的迭代器删除掉,则 it 指向的迭代器会失效,如果仍然对 it 进行解引用,则会发生报错;erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理 论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end 的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素 时,vs就认为该位置迭代器失效了

#include <vector>
#include <algorithm>
int main()
{
    vector<int> v{1,2,3,4,5};
    vector<int>::iterator it = find(v.begin(), v.end(), 3);
    v.erase(it);
    while(it != v.end())
    {
        cout << *it << " ";
        ++it;
    }          //因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的
               //erase删除的迭代器如果是最后一个元素,删除之后it已经超过end
               //                         此时迭代器是无效的,++it导致程序崩溃
    return 0;
}

(此问题在string中也会出现,而且如果在linux环境下运行程序,由于g++编译器对于迭代器失效的检测并不严格,所以当迭代器失效后,对失效后的迭代器进行引用并不会报错,但是运行结果已经不同)

迭代器失效解决方法在使用前,对迭代器重新赋值

相关文章:

  • leecode417.太平洋大西洋水流问题
  • PyQt5 - Groove 启用高 DPI 支持,使得应用程序能够自动适应不同的屏幕分辨率
  • numpy学习笔记6:np.sin(a) 的详细解释
  • 《声音的未来:语音识别文献解读》专栏介绍及其文章解读目录
  • 微学习:提高企业培训效率的创新方式
  • 挖矿------获取以太坊测试币
  • 基于大模型的慢性鼻窦炎全周期预测与治疗方案研究报告
  • 云钥科技工业相机定制服务,助力企业实现智能智造
  • PCL 高斯函数拟合(正太分布)
  • 《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用
  • 【Java项目】基于JSP的智能停车场管理系统
  • 蓝桥杯刷题 Day2 AC自动机(二次加强版)
  • linux 命令 vim
  • 若依前端框架增删改查
  • c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!
  • 三个线程按顺序交替打印 A B C
  • Power Apps 技术分享:使用控件的相对布局
  • 组态王Kingview配置为OPCUA服务器的一些问题处理
  • [快乐学坊management_1] With Cursor | Mysql设计 | 服务接口设计与开发
  • PyTorch 深度学习实战(17):Asynchronous Advantage Actor-Critic (A3C) 算法与并行训练
  • 选址江南制造总局旧址,上海工业博物馆建设有新进展
  • 习近平向多哥新任领导人致贺电
  • 香港特区立法会通过条例草案便利外地公司迁册来港
  • 夜读丨读《汉书》一得
  • 中国海警舰艇编队5月14日在我钓鱼岛领海巡航
  • 彭丽媛同巴西总统夫人罗桑热拉参观中国国家大剧院