Arduino 数据结构: ArrayList

ArrayList 类是一个 C++ 模板类,它提供了 ArrayList 的实现,以便轻松存储任何指定类型的值。它允许使用索引进行高效存储和检索,支持排序操作。

ArrayList 类提供以下功能和特性:

  • 动态调整大小 :列表在已满时动态调整自身大小(默认行为)。
  • 固定大小选项 :可以使用固定大小实例化以防止调整大小。
  • 迭代器支持 :支持对元素进行迭代。
  • 排序算法 :提供多种排序算法(冒泡排序、快速排序、合并排序)。
  • 内存优化 :使用编译器指令根据约束包含或排除功能。
  • 高级功能 :提供批量添加、删除、克隆和容量管理。

ArrayList API 参考

用法

要使用 ArrayList 类,请包含库标头并实例化列表:

#include <ArrayList.h> 
ArrayList<int> myList(ArrayList<int>::DYNAMIC, 10); //This is a faster resize, but less reliable. Can cause problems. 
ArrayList<int> myotherlist(ArrayList<int>::DYNAMIC2, 10); //This is a slower resize, but more reliable.  
ArrayList<String> strList(ArrayList<String>::FIXED, 5); //This can never be reized (while in fixed mode)
功能 描述
ArrayList(SizeType type = DYNAMIC2, size_t initialSize = 8);

创建具有可选初始大小和大小类型(DYNAMIC、DYNAMIC2、FIXED)的 ArrayList。默认值为 DYNAMIC2。
~ArrayList();   析构函数释放分配的内存。
void add(T item);  将项目添加到列表中。
bool insert(size_t index, T item); 在给定索引处插入项目。
bool removeItem(T item);  按值删除项目。
void remove(size_t index); 按索引删除项目。
void clear();   清除列表中的所有元素。
bool addAll(const ArrayList& other); 添加另一个列表中的所有元素。
bool insertAll(size_t index, const ArrayList& other); 在给定索引处插入另一个列表的所有元素。
bool removeIf(bool (*predicate)(T)); 删除满足给定条件的元素。
void removeRange(size_t fromIndex, size_t toIndex); 删除指定范围内的元素。
bool retainAll(const ArrayList& other); 仅保留存在于另一个列表中的元素。
T get(size_t index) const; 检索给定索引处的项。
String getAsString(size_t index) const; 以字符串形式检索项目。
bool contains(T item) const; 检查列表中是否存在项目。
size_t indexOf(T item) const; 返回项的索引,如果找不到,则返回 -1。
size_t size() const;   返回列表中的元素数。
size_t capacity() const;   返回调整大小之前的最大元素数。
bool isEmpty() const;   检查列表是否为空。
void sort(bool (*comparator)(T, T)); 使用比较器函数对列表进行排序。
void setSortAlgorithm(SortAlgorithm algorithm); 选择排序算法。
SortAlgorithm getSortAlgorithm(); 检索当前排序方法。
void forEach(void (*consumer)(T)) const; 迭代元素并应用函数。
void ensureCapacity(size_t minCapacity); 确保列表有足够的容量。
void trimToSize();   减少容量以匹配元素数量。
void setSizeType(SizeType type); 更改列表大小调整模式。
SizeType getSizeType();   检索当前调整大小模式。
void setInitialSize(size_t size); 设置列表的初始大小。
size_t getInitialSize();  size_t getInitialSize(); 检索初始大小。
ArrayList* clone() const; 创建列表的相同副本。
ArrayList* clone(int InitialCapacity) const; 克隆具有指定容量的列表。
ArrayList* sublist(size_t fromIndex, size_t toIndex) const; 提取列表的一部分。

算法 描述
BUBBLE_SORT 简单但效率低下的排序算法。
QUICK_SORT 快速排序算法,适用于大型数据集。
MERGE_SORT 稳定可靠的分选方式。

高级内存控制 (慎用)
void setCapacity(size_t capacity); 手动设置列表容量。慎 ⚠️ 用!
void setCount(size_t count); 手动设置元素数。 ⚠️ 可能会导致意外行为!

用于优化的编译器指令 慎用!
#define SkinnyArray 删除内存密集型函数以进行优化。
#define OverrideSort  当 SkinnyArray 处于活动状态时,重新启用排序功能。
#define OverrideAddAll 如果使用 SkinnyArray,则重新启用批量添加函数。
#define OverrideUtilityFunctions 重新启用克隆等实用功能。
#define IKnowWhatIAmDoing 授予对手动内存控件的访问权限。 ⚠️ 处理时要格外小心!

示例

#include <ArrayList.h>

// 创建一个整型的数据列表
ArrayList<int> myList; 

void setup() {
    Serial.begin(9600); // 初始化串口

    // 添加元素到列表
    Serial.println("Adding elements...");
    for (int i = 0; i < 5; i++) {
        myList.add(i * 10); 
    }

    // 插入一个元素
    Serial.println("Inserting element at index 2...");
    myList.insert(2, 25); // 在索引位置2插入

    // 移除一个元素
    Serial.println("Removing element at index 3...");
    myList.remove(3); // 移除索引位置3的元素

    // 检查是否包含指定元素
    if (myList.contains(20)) { 
        Serial.println("List contains 20");
    } else {
        Serial.println("List does not contain 20");
    }

    // 打印列表元素
    Serial.println("Current List:");
    for (int i = 0; i < myList.size(); i++) {
        Serial.println(myList.get(i));
    }

    // 清除列表
    Serial.println("Clearing the list..."); 
    myList.clear();

    // 检查列表是否为空
    if (myList.isEmpty()) {
        Serial.println("List is empty");
    }
}

void loop() {
    // Your loop code here
}

安装

在Arduino IDE的库管理器中,搜索ArrayList,安装下面的库

Arduino 数据结构: ArrayList


与数组结构相比,ArrayList提供了更加便利和高级的集合数据操作。
https://github.com/braydenanderson2014/C-Arduino-Libraries/blob/main/lib/ArrayList/README.md

- 本文为本站原创文章,转载请保留出处。
- 文章链接:https://www.xpstem.com/article/2000405

08-22   阅读(2)   评论(0)
 标签: 编程 Arduino 数据结构

涨知识
MQTT

MQTT协议是一个应用层协议,他要求使用的传输层协议能提供有序的,可靠的双向字节流传输服务。

评论:
相关文章
小鹏浇花套件单机版程序V1.0.0

本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。


ESP32 FreeRTOS 双核使用

ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。


理解 MSBFIRST(最高有效位)和 LSBFIRST(最低有效位)

在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。


Arduino 和 TB6612FNG 驱动直流电机

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。


Arduino-ESP32 Preferences库使用详解

Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。


Arduino Serial 接收数字

在Arduino中,通过串行端口接收数字通常涉及使用Serial.read()、Serial.readString()、Serial.parseInt()等方法。



Arduino 随机数

要生成随机数,可以使用Arduino随机数函数random()。


Arduino 字符串用法汇总

本文收集整理在Arduino环境下字符串的相关用法,供参考。


ESP32在Arduino中的GPIO模式

ESP32在Arduino中的GPIO模式。

搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。