1. vector

  • 变长数组,长度根据需要而自动变化的数组。
  • 当普通数组会超过内存的情况,这种情况使用vector会让问题的解决便捷许多。
  • vector可以用来以邻接表的方式存储图

1.1 vector的定义

  1. 定义一维变长数组
vector<typename> name;

这个的typename可以是任何基本类型,也可以是STL标准容器模板。

需要注意:如果typename是一个STL容器,定义的时候要在>>符号之加上空格!

vector<int> name;
vector<node> name; //node是结构体
vector<vector<int> > name; // >>之间要加空格,防止被编译器误认为是移位符号!
  1. 定义二维变长数组

    • Arrayname中的每一个元素都是一个vector。
    • 可以把二维vector数组当作两个维都可以变长的二维数组理解。
vector<typename> Arrayname [arraySize];

与vector<vector > name不同,vector Arrayname [arraySize];的一维长度已经被固定为arraySize,仅剩另一维是变长的。

1.2 vector容器内元素的访问

  1. 通过下标访问

    直接通过vi[index]

  2. 通过迭代器访问

    • 迭代器可以理解为类似指针的东西

      vector<typename>::iterator it;

      可以通过it*来访问vector里的元素。

    • 代码实例

      #include <stdio.h>
      #include <vector>
      using namespace std;
      int main() {
      vector<int> vi;
      for(int i = 1; i<= 5; i++){
      vi.push_back(i);
      }
      vector<int>::iterator it = vi.begin();
      for(int i = 0; i<5; i++){
      printf("%d ",*(it + i));
      }
      return 0;
      }
      #include <stdio.h>
      #include <vector>
      using namespace std;
      int main() {
      vector<int> vi;
      for(int i = 1; i<= 5; i++){
      vi.push_back(i);
      }
      for(vector<int>::iterator it = vi.begin();it != vi.end(); it++){
      printf("%d ",*it);
      }
      return 0;
      }

      !可以看到vi[i]和*(vi.begin()+i)是等价的。

      !begin()是作为取vi的首元素,end()是作为尾元素地址,且end()作为迭代器末尾元素,不储存任何元素。

      !vector的迭代器不支持 it < vi.end() 写法,因此循环条件只能用 it != vi.end()。

      ! 只有在vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法。

1.3 vector 常用函数实例解析

  1. push_back()

    在vector后面添加一个元素x,时间复杂度为\(O(1)\)

    #include <stdio.h>
    #include <vector>
    using namespace std;
    int main() {
    vector<int> vi;
    for(int i = 1; i<= 3; i++){
    vi.push_back(i);//将1、2、3依次插入vi末尾
    }
    for(int i=0; i<vi.size(); i++){
    printf("%d ", vi[i]);//size给出vi中元素的个数
    }
    return 0;
    }
  2. pop_back()

    在vector删除末尾元素x,时间复杂度为\(O(1)\)

    #include <stdio.h>
    #include <vector>
    using namespace std;
    int main() {
    vector<int> vi;
    for(int i = 1; i<= 3; i++){
    vi.push_back(i);//将1、2、3依次插入vi末尾
    }
    vi.pop_back(); //删除vi的末尾元素
    for(int i=0; i<vi.size(); i++){
    printf("%d ", vi[i]);//size给出vi中元素的个数
    }
    return 0;
    }
  3. size()

    所有容器都有的返回元素个数,是unsigned类型,一般就用%d

  4. clear()

    用来清空vector中所有元素,时间复杂度为\(O(N)\)

    #include <stdio.h>
    #include <vector>
    using namespace std;
    int main() {
    vector<int> vi;
    for(int i = 1; i<= 3; i++){
    vi.push_back(i);//将1、2、3依次插入vi末尾
    }
    vi.clear();
    printf("%d\n",vi.size());
    return 0;
    }
  5. insert()

    insert(it,x)用来向vector的任意迭代器it中插入一个元素x,时间复杂度\(O(N)\)

    #include <stdio.h>
    #include <vector>
    using namespace std;
    int main() {
    vector<int> vi;
    for(int i = 1; i<= 5; i++){
    vi.push_back(i);//将1、2、3、4、5依次插入vi末尾
    }
    vi.insert(vi.begin() + 2,-1);//在vi[2]的为止插入-1
    for(int i=0; i<vi.size();i++){
    printf("%d ",vi[i]);
    }
    return 0;
    }
  6. erase()

    • 删除单个元素

      #include <stdio.h>
      #include <vector>
      using namespace std;
      int main() {
      vector<int> vi;
      for(int i = 5; i<= 9; i++){
      vi.push_back(i);//将5、6、7、8、9依次插入vi末尾
      }
      vi.erase(vi.begin() + 3); //删除vi[3]位置的元素
      for(int i=0; i<vi.size();i++){
      printf("%d ",vi[i]);
      }
      return 0;
      }
    • 删除一个区间内的所有元素(左闭右开)

      #include <stdio.h>
      #include <vector>
      using namespace std;
      int main() {
      vector<int> vi;
      for(int i = 5; i<= 9; i++){
      vi.push_back(i);//将5、6、7、8、9依次插入vi末尾
      }
      vi.erase(vi.begin() + 1,vi.begin() + 4); //删除vi[1]到v[4]位置的元素(左闭右开),即删去vi[1]、vi[2]、vi[3]
      for(int i=0; i<vi.size();i++){
      printf("%d ",vi[i]);
      }
      return 0;
      }

1.4 vector的常见用途

  1. 存储数据
  2. 用邻接表存储图

C++ 标准模板库(STL):vector的更多相关文章

  1. C++标准模板库(STL)——vector常见用法详解

    vector的定义 vector<typename> name; 相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是& ...

  2. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  3. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  4. C++ 标准模板库(STL)

    C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...

  5. STL学习系列之一——标准模板库STL介绍

    库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...

  6. 标准模板库--STL

    标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...

  7. C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...

  8. 标准模板库(STL)学习探究之stack

    标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string

  9. 实验8 标准模板库STL

    一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...

  10. C++ 标准模板库STL 队列 queue 使用方法与应用介绍

    C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...

随机推荐

  1. CSS系列 (05):浮动详解

    浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止.由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样. -- W3C 文字环绕 float可以 ...

  2. java的多线程:线程安全问题

    什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作是不会发生数据冲突问题. 抢火车的例子: ...

  3. Angular入门到精通系列教程(6)- Angular的升级

    1. 摘要 2. https://update.angular.io/ 3. 总结 环境: Angular CLI: 11.0.6 Angular: 11.0.7 Node: 12.18.3 npm ...

  4. Linux服务器下安装Composer 并使用Composer安装Thinkphp5.0

    Composer官方文档:https://docs.phpcomposer.com/00-intro.htmlComposer是一个php的包管理器.要求php版本在5.3以上. 一.安装Compos ...

  5. Supervisord进程管家

    Supervisord进程管家 Supervisord是一个守护进程的工具,当进程意外终止或服务器掉电起来后,希望进程能够自动运行,supervisord可以很好的为我们做这件事情.同时supervi ...

  6. Java基础概念性问题整理,面试题型整理,附带答案详解供参考,首次整理!

    题目目录 Java基础 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建对象的几种方式 7. ...

  7. 浅谈sql索引

    索引是什么 假如你手上有一个你公司的客户表,老板说找什么客户你就得帮他找出来. 客户不多的时候,你拿着手指一行一行滑,费不了多少时间就能找到. 后来公司做大了,客户越来越多,好几页的客户,你发现,一行 ...

  8. Hash Tables and Hash Functions

    Reference: Compuer science Introduction: This computer science video describes the fundamental princ ...

  9. Spring MVC 接收 LocalDate、LocalTime 和 LocalDateTime Java 8 时间类型参数

    使用 Spring MVC 时,很多业务场景下 Controller 需要接收日期时间参数.一个简单的做法是使用 String 接收日期时间字符串(例如:2020-01-29),然后在代码中将其转换成 ...

  10. 【Oracle】 并行查询

    所谓并行执行,是指能够将一个大型串行任务(任何DML,一般的DDL)物理的划分为叫多个小的部分,这些较小的部分可以同时得到处理.何时使用并行执行:1.必须有一个非常大的任务 2.必须有充足的资源(CP ...