一,C嘎嘎STL  

        在实际项目开发中,无论是 C++ 还是 C 语言,都不建议自行手写数据结构实现 —— 现成的成熟库 / 标准容器往往更可靠。

        而单片机开发中对数据结构的使用本就偏少,核心原因在于:但凡涉及稍复杂的动态数据结构,几乎都离不开malloc这类动态内存分配操作;但单片机场景下,动态内存申请的风险极高(易引发内存碎片、堆溢出、稳定性问题等),因此行业内的通用原则是 “能规避就规避”。

        在实际项目开发中,优先选用 C++ 标准模板库(STL)的容器而非手写数据结构,既高效又能规避手写实现的漏洞。以最常用的动态数组容器vector为例,其封装了动态内存管理、自动扩容等核心能力,是项目中替代手写顺序表的最优选择。

二,STL vector

#include <iostream>
// 引入vector头文件
#include <vector>
// 引入算法库(用于查找)
#include <algorithm>

using namespace std;

int main()
{
    // 1. 初始化vector(动态数组),存储整型数据
    vector<int> dataVec;  // 无需预先指定容量,默认空容器

    // 2. 向容器尾部添加元素(push_back,自动扩容)
    dataVec.push_back(10);
    dataVec.push_back(20);
    dataVec.push_back(30);
    dataVec.push_back(40);
    cout << "初始容器内容:";
    for (int num : dataVec)
    {  // 范围for遍历(C++11+)
        cout << num << " ";
    }
    cout << endl;  // 输出:10 20 30 40

    // 3. 在指定位置插入元素(insert)
    // 插入到索引1的位置(第二个元素前),值为15
    dataVec.insert(dataVec.begin() + 1, 15);
    cout << "插入15后:";
    for (int i = 0; i < dataVec.size(); ++i)
    {  // 传统下标遍历
        cout << dataVec[i] << " ";
    }
    cout << endl;  // 输出:10 15 20 30 40

    // 4. 删除指定位置元素(erase)
    // 删除索引1的元素(值为15)
    dataVec.erase(dataVec.begin() + 1);
    cout << "删除索引1元素后:";
    for (auto it = dataVec.begin(); it != dataVec.end(); ++it)
    {  // 迭代器遍历
        cout << *it << " ";
    }
    cout << endl;  // 输出:10 20 30 40

    // 5. 查找元素(使用STL算法find)
    int target = 30;
    auto findIt = find(dataVec.begin(), dataVec.end(), target);
    if (findIt != dataVec.end())
    {
        // 计算找到的元素索引
        int index = findIt - dataVec.begin();
        cout << "找到元素" << target << ",索引:" << index << endl;  // 输出:索引2
    }
    else
    {
        cout << "未找到元素" << target << endl;
    }

    // 6. 修改指定索引元素(直接通过下标赋值)
    dataVec[2] = 300;
    cout << "修改索引2元素后:";
    for (int num : dataVec)
    {
        cout << num << " ";
    }
    cout << endl;  // 输出:10 20 300 40

    // 7. 容器常用属性与操作
    cout << "当前元素个数:" << dataVec.size() << endl;         // 输出:4
    cout << "当前容器容量:" << dataVec.capacity() << endl;     // 容量随扩容自动调整
    cout << "容器是否为空:" << (dataVec.empty() ? "是" : "否") << endl;  // 输出:否

    // 8. 清空容器
    dataVec.clear();
    cout << "清空后容器是否为空:" << (dataVec.empty() ? "是" : "否") << endl;  // 输出:是

    return 0;
}

三,QT QVector

        QT 是基于 C++ 的开发框架,完全兼容标准 C++ 的 STL 库,因此std::vector可以在 QT 项目中直接使用,和普通 C++ 项目中使用vector的方式完全一致。

        同时,QT 也提供了自己的动态数组容器QVector,它是 QT 容器体系的一部分,和std::vector功能类似,但针对 QT 的生态做了适配(比如信号槽、跨平台、隐式共享等)。

#include <QCoreApplication>
#include <iostream>
// 引入STL的vector头文件
#include <vector>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    // 1. 定义并使用std::vector
    std::vector<int> vec;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    // 2. 遍历vector
    qDebug() << "std::vector:"; // QT的调试输出函数
    for (int num : vec)
    {
        qDebug() << num;
    }

    // 3. 结合QT的其他功能使用
    std::vector<QString> strVec; // 存储QT的QString类型
    strVec.push_back("QT");
    strVec.push_back("STL");
    strVec.push_back("Vector");

    for (const QString& str : strVec)
    {
        qDebug() << "string:" << str;
    }

    return a.exec();
}

运行结果:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐