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();"这个实现多此一举, 编译器也不让这么写
    

原文链接:https://www.cnblogs.com/Long23/p/17275898.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:STL 容器 002 (vector 详解) - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 用C++编写一个简单的发布者和订阅者

    摘要:节点(Node)是通过 ROS 图进行通信的可执行进程。 本文分享自华为云社区《编写一个简单的发布者和订阅者》,作者: MAVER1CK 。 @[toc] 参考官方文档:Writing a simple publisher and subscriber (C++) 背景 节点(Node)是通过 ROS 图进行通信的可执行进程。 在本教程中,节点将通过话…

    C++ 2023年4月27日
    00
  • 非常可乐

    题目描述 大家一定觉得运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为\(S (S < 101)\)毫升 (正好装满一瓶) ,它们三个之间可…

    C++ 2023年4月27日
    00
  • 【Visual Leak Detector】库的 22 个 API 使用说明

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇主要介绍 VLD 库提供的 22 个外部接口。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 头文件简介 2. 文件 vld_def.h 简介 3. 文件 vld.h 简介 3.1 接口 VLDDisable 3.2 接口 VLDEnable 3.3 接口 VLDRestore…

    C++ 2023年4月17日
    00
  • 07、【算例】openfoam带孔盘体应力分析

    官网:https://doc.cfd.direct/openfoam/user-guide-v9/platehole$FOAM_TUTORIALS/stressAnalysis/solidDisplacementFoam下的案例 1、网格划分 /*——————————–*- C++ -*—————…

    C++ 2023年4月18日
    00
  • C++文件处理

    ? 新建文件 //这是要操作的文件名称 string str_filename = “E:/data/t/haha.txt”; //创建一个流对象 o 就是从这个流对象出去, 出到哪里, 当然是我们要建立的文件 ofstream ofs; //out会覆盖 ofs.open(str_filename, ios::out); ofs << “我创建…

    C++ 2023年4月17日
    00
  • 第四部分:Spdlog日志库的核心组件分析-logger

    Spdlog是一个快速且可扩展的C++日志库,它支持多线程和异步日志记录。在本文中,我们将分析Spdlog日志库的核心代码,探究其实现原理和代码结构。 Spdlog的基本架构 上一篇文章介绍了spdlog的五个主要组件,其中最重要是Logger、Sink和Formatter其中,Logger负责日志的记录和管理,Sink负责将日志输出到不同的目标(比如控制台…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】源码文件概览

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇对 VLD 源码包中的各文件用途做个概述。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 整体概览 2. 文件夹 .teamcity 3 文件夹 lib 3.1 文件夹 cppformat(生成 libformat) 3.2 文件夹 dbghelp 3.3 文件夹 gtest(…

    C++ 2023年4月24日
    00
  • C语言跳转浏览器打开指定URL

    #include <stdlib.h> int main() { // 定义要打开的URL char* url = “https://rjku.gitee.io/”; // 调用系统命令以默认浏览器打开URL char command[100]; sprintf(command, “open %s”, url); system(command);…

    C++ 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部