博客
关于我
C++ STL
阅读量:741 次
发布时间:2019-03-21

本文共 2946 字,大约阅读时间需要 9 分钟。

C++ 动态数组与容器详解

Vector(动态数组)

一个vector 是C++中常用的动态数组,其优势在于能够以动态的方式扩展,不需要提前分配好内存。无论是整数、浮点数、字符串,还是自定义的结构体,vector都可以储存这些数据类型。

vector基础定义

使用#include<vector>头文件

数据类型的名称可以是任意名字,例如:

vector
a;vector
b;vector
c;// 定义结构体并使用struct Person { int age; string name;};vector
d;

vector基本操作

  • 动态扩展尾部

    使用a.push_back()方法将元素添加到尾部

  • 查找当前长度

    使用a.size()获取当前元素个数

  • 修改具体位置的元素值

    直接赋值a[位置] = 数值

  • 删除最后一个元素

    使用a.pop_back()(括号内不需要添加元素)

  • 清空vector

    使用a.clear()删除所有元素

  • 判断是否为空

    a.empty()返回布尔值,表示是否无元素

  • 访问前导或末尾元素

    a.front()返回第一个元素,a.back()返回最后一个元素

  • 迭代访问元素

    使用vector::iterator来遍历:

  • vector
    a = {1, 2, 3};vector
    ::iterator it = a.begin();for(; it != a.end(); ) { printf("%d\n", *it); it++;}

    Stack(栈)

    Stack是一个先进后出(FIFO)的操作方式,栈顶始终是最last-in的元素。

    Stack定义

    使用#include<stack>头文件

    栈的命名规则为空:

    stack
    a_stack;

    Stack基本操作

  • 获取栈中元素个数

    注意:在std::栈中,大多数操作要比std::queue更复杂,需要手动管理个数

  • 判断栈是否为空

    使用a_stack.empty(),返回truefalse

  • 将元素压入栈顶

    使用a_stack.push()方法

  • 返回栈顶元素

    使用a_stack.top()

  • 弹出栈顶元素

    使用a_stack.pop()

  • 需要注意的是,std::栈没有直接的迭代器可用,遍历需要借助指针或索引

    Map(映射)

    Map是根据键-值对存储数据的容器,默认支持自定义的排序和比较方式

    Map定义

    使用#include<map>头文件

    map的键值对可以用任意数据类型,例如:

    map
    a_map;map
    b_map;// 结构体作为键或值struct Point { int x; int y;};map
    c_map;

    Map基本操作

  • 获取map的起始和结束迭代器

    auto it = a_map.begin();a_map.end();
  • 清空map中所有元素

    a_map.clear()

  • 查找特定键值对

    使用a_map.count(key),返回对应键的出现次数

  • 判断是否为空

    a_map.empty()

  • 插入或修改键值对

    使用a_map.insert()(有重复键值会选择覆盖)或a_map[键] = 值

  • 删除特定键值对

    使用a_map.erase(),可以带参数或不带参数(根据键值对被删除)

  • 查找特定键值对的位置

    使用a_map.find(key),返回迭代器对象

  • 交换两个map

    使用swap()函数或交换()方法

  • 计算元素个数

    a_map.size()

  • 遍历map

    for (auto it = a_map.begin(); it != a_map.end(); ++it) {    // it.first是键,it.second是值    cout << it.first << " -> " << it.second << endl;}
  • Set(集合)

    Set是具有去重、排序功能的高级集合,默认按从小到大的顺序存储元素

    Set定义

    使用#include<set>头文件

    set的名称规则为空:

    set
    a_set;set
    b_set;

    Set基本操作

  • 插入元素

    a_set.insert();,无需判断元素是否存在

  • 返回第一个或最后一个元素

    使用a_set.begin()a_set.end()

  • 判断是否为空

    a_set.empty()

  • 清空所有元素

    a_set.clear()

  • 查找特定元素的位置

    a_set.find(key)

  • 维度:elements.size()`

  • 删除特定元素

    a_set.erase(key)(或单个元素)

  • 集合的唯一性

    for (auto it = a_set.begin(); it != a_set.end(); ++it) {    cout << *it << endl;}
  • Queue(队列)

    Queue是一个先进先出(FIFO)的操作方式,队首元素第一被读取,队尾元素最后被插入

    Queue定义

    使用#include<queue>头文件

    队列命名规则为空:

    queue
    a_queue;

    Queue基本操作

  • 将元素加入队列尾部

    a_queue.push();

  • 读取队首或队尾元素

    a_queue.front()a_queue.back()

  • 移除元素

    a_queue.pop()移除队首元素

  • 判断是否为空

    a_queue.empty()返回布尔值

  • 获取队列长度

    a_queue.size()

  • 需要注意的是,std::队列没有直接的迭代器,可通过 указ指针或索引方法访问队列数据

    priority_queue(优先队列)

    优先队列是一种基于堆结构的容器,它默认按照小到大的顺序排序,并取到最大或最小的元素

    priority_queue定义

    定义优先队列:

    priority_queue
    a_hp;priority_queue
    , greater
    > a_hp; // 指定使用greater作为比较函数

    priority_queue基本操作

  • 读取堆中的最大值

    a_hp.top()

  • 移除堆顶元素

    a_hp.pop()

  • 其他操作与普通队列一致,依次为:

    • push();
    • size();
    • empty();
    • 取堆大小即可知堆中元素个数
  • 优先队列与普通队列不同之处在于,它内部总是保持高度有序,因此在查找堆顶元素时效率更高。

    总结

    以上是C++中常用容器的定义和基本操作总结。对于新手来说,建议从简单的vector开始学习,逐步理解容器的特性和适用场景。在开发过程中,根据具体需求选择合适的容器可以优化代码性能和可读性。在写代码时,请注意遵循正确的命名规范,方便团队协作和项目维护。

    转载地址:http://ltagz.baihongyu.com/

    你可能感兴趣的文章
    localhost:5000在MacOS V12(蒙特利)中不可用
    查看>>
    logstash mysql 准实时同步到 elasticsearch
    查看>>
    Luogu2973:[USACO10HOL]赶小猪
    查看>>
    mabatis 中出现&lt; 以及&gt; 代表什么意思?
    查看>>
    Mac book pro打开docker出现The data couldn’t be read because it is missing
    查看>>
    MAC M1大数据0-1成神篇-25 hadoop高可用搭建
    查看>>
    mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
    查看>>
    Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
    查看>>
    MangoDB4.0版本的安装与配置
    查看>>
    Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
    查看>>
    mapping文件目录生成修改
    查看>>
    MapReduce程序依赖的jar包
    查看>>
    mariadb multi-source replication(mariadb多主复制)
    查看>>
    MariaDB的简单使用
    查看>>
    MaterialForm对tab页进行隐藏
    查看>>
    Member var and Static var.
    查看>>
    memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
    查看>>
    memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
    查看>>
    Memcached:Node.js 高性能缓存解决方案
    查看>>
    memcache、redis原理对比
    查看>>