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日

相关文章

  • 13、c++使用单例模式实现命名空间函数

    本案例实现一个test命名空间,此命名空间内有两个函数,分别为getName()和getNameSpace(); 声明命名空间及函数 namespace test{ const std::string& getName()和(); const std::string& getNameSpace(); } 命名空间内实现单例类 实现一个单例类,…

    C++ 2023年4月24日
    00
  • 高效c语言1快速入门

    本章将开发你的第一个C语言程序:传统的 “Hello, world!”程序。然后讨论一些编辑器和编译器的选项,并阐述移植性问题。 Hello, world! #include <stdio.h> #include <stdlib.h> int main(void) { puts(“Hello, world!”); return EXI…

    C++ 2023年5月10日
    00
  • C++的引用变量作为函数参数

    一、问题引入 在C++的中新增一个特性:按引用传递变量,虽然与按传递变量的地址可以实现相同的结果,但引用有其独特的地方。 引用传递: 引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。 通过引用变量用作参数,函数将使用原始数据,而不是其副本。 二、解决过程 举例说明: #include <iostream> using nam…

    C++ 2023年4月17日
    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
  • 非常可乐

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

    C++ 2023年4月27日
    00
  • C++ 入门

    001 c++ 如何工作 任何以 # 开头的语句,都是预处理语句,所谓的预处理语句,在编译之前,就已经被处理了 关键字 include:找到 <> 文件(通常称为“头文件”),然后将 <> 中的所有内容拷贝到现在的文件里 main()比较特殊,虽然它的返回值类型是 int,但它不一定需要返回值,如果不设置返回值,默认返回 0 <…

    C++ 2023年5月11日
    00
  • C++:explicit关键字

    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显示的,而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。 那么显示声明的构造函数和隐式声明的有什么区别呢? 来看下面的例子: class CxString // 没有使用explicit关…

    C++ 2023年4月18日
    00
  • C++动态分配(new)二维数组的若干方法

    写在前面 之前刷动态规划的题目,多需要用到二维数组(也许后面再优化成一维)。如果每次都按照给定数的范围直接声明为全局二维数组变量,又总觉得的不够优雅。查阅了一些网上的资料后,总结了一些使用方法,就写下这篇博文用以记录。 方法1——动态分配(new)一维数组,再强制类型转换为二维(个人使用,推荐指数:⭐⭐⭐⭐) 直接看例子 /** 假设需要根据两个string…

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