6.C嘎嘎STL vector
·
一,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();
}
运行结果:

更多推荐

所有评论(0)