博客
关于我
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/

    你可能感兴趣的文章
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>
    【Java基础】什么是面向对象?
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>
    mysql 添加索引
    查看>>
    MySQL 添加索引,删除索引及其用法
    查看>>
    mysql 状态检查,备份,修复
    查看>>
    MySQL 用 limit 为什么会影响性能?
    查看>>
    MySQL 用 limit 为什么会影响性能?有什么优化方案?
    查看>>