STL容器_002 _vector 详解

为什么

各方面表现都比较中等, 适用范围广

尾插很快, 查找也比较快

是什么

  • 动态数组
vector
  • 特点:

    • 动态数组, 三个指针控制
    • 两倍增长
      • 扩充的方法: 不能原地扩充, 因为后面可能会有其他的东西, 必须在 其他地方开辟一块更大的内存
    • 提供[]
      • 所有的有连续空间的容器都有[]
  • iterator是class类型的

怎么样

制造

  • 两倍增长
  //push_back() 检查剩余的空间
  //有, 继续增长
  //没有,计算
  	//开始是不是0
  		//是0 放1个
          //不是0 分配两倍的空间
      //将原来内容拷贝到新的vector   (拷贝构造)
      //原来的要删掉(析构)
      //插进最新push_back的元素

使用

  1. 初始化

    //C11后是用 initializer_list 实现的
    vector<int>vec = {1,2,3};
    
    //拷贝
    vector<int>vec1(vec);
    vector<int>vec2(100,5);	//100个5
    vector<int>vec3(100)		//100个0
    
    //直接添加元素(C11) 也是用了 C11 中的 initializer_list 
    vector<int>vec{1,2,3};
    
    //复制数组
    int i[5] = {1,2,3,4,5};
    vector<int> vec(i,i+5);
    
  2. 状态查看(主要是容量)

    //返回元素个数
    vec.size();
    
    //返回扩容后最多能容纳的元素个数
    vec.max_size();
    
    //返回分配的容量
    vec.capacity();
    
    //是否为空, 为空就返回true
    vec.empty();
    
  3. 改变capacity与size

    //容量设为100
    vec.reserve(100);
    //如果capacity<size 会发生什么?
    
    //把容量改成size
    vec.shrink_to_fit();
    
    //resize少了直接去掉多余的元素, 多了如果指定了数就填充指定的元素, 这里没有指定就默认填充0
    //底下最后输出 1 2 3 4 5 100 100 100 0 0 0 0
    for (int i=1;i<10;i++) myvector.push_back(i);
    myvector.resize(5);
    myvector.resize(8,100);
    myvector.resize(12);
    
  4. 改变 / 查看元素(不改变size)

    //[]
    vec[8] = vec[10];
    
    //at
    vec.at(10) = vec.at(9);
    
    //返回最前一个或最后一个元素, 可以作为左值
    myvector.front() -= myvector.back();
    
    //data该函数返回一个指向数组中第一个元素的指针,该指针在向量内部使用
    vec.data();
    
    • 小伙伴们应该看出来了, 上面前三个既可以作为左值; 也可以作为右值
  5. 更易型操作(改变size)

    //尾插
    vec.push_back(5);
    vec.emplace_back(5);//在末尾直接生成, 也许比push_back快一点点. 据说可以初始化对象的多个成员. 
    
    //尾删
    vec.pop_back();
    
    //插入元素
    //往迭代器指向的前面开始插入元素 (这很好理解,考虑到end,不可能是向后) , 返回第一个插入元素的位置
    vec.insert(vec.begin,2,3);	                           //在前面插入2个3
    vec.insert(vec.begin()+1,vec1.begin(),vec1.begin()+5);  //第一个填自己的迭代器, 后两个填另外一个对象的迭代器 把那个前闭后开区间插到自己元素的前面
    
    //移除元素
    //移除某个位置的元素或者某个[)区间的元素, 返回下一个元素的位置
    vec.erase(pos);
    vec.erase(beg,end);
    
    //assign
    //7个100
    vec.assign(7,100);	      //如果vec里面有元素, 会清除掉里面的元素
    vec.assign(vec.end(),8,6)  //在vec的末尾插入8个6
    //迭代器分配
    vec.assign(it,it+5);
    //类似前面初始化的时候的从数组分配
    int i[6] = {1,2,3,4,5,6};
    vec.assign(i,i+4);
    
  6. 算法类 查找/排序

    //全局find	(sort很慢,先sort再binary research不一定快)
    find();
    
    //全局sort	(自己如果有sort,就用自己的sort)
    sort();
    //vector无自己的sort. "vector.sort();"这个实现多此一举, 编译器也不让这么写
    

posted @ 2023-03-31 12:17  无形深空  阅读(76)  评论(0编辑  收藏  举报